unit UHotKey1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls;

type
  TForm1 = class(TForm)
    ListBox1: TListBox;
    ListBox2: TListBox;
    BAdd: TButton;
    BErase: TButton;
    Edit1: TEdit;
    HotKey1: THotKey;
    BChange: TButton;
    BFound: TButton;
    OpenDialog1: TOpenDialog;
    Label1: TLabel;
    Label2: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure BFoundClick(Sender: TObject);
    procedure ListBox1Click(Sender: TObject);
    procedure BAddClick(Sender: TObject);
    procedure BChangeClick(Sender: TObject);
    procedure BEraseClick(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
    procedure Reg(Index: word);
    procedure WMHotKey(var a: TWMHotKey); message WM_HOTKEY;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

uses UHotKey2, ShellAPI, Menus;

{$R *.dfm}
var F: Text;
    SFile: string = 'HotKey.dat';

procedure TForm1.Reg(Index: word);
var SHotKey: string;
    atom, fsModifiers, vk: word;
begin
  SHotKey := ListBox2.Items[Index];
  atom := GlobalAddAtom(PChar(ListBox1.Items[Index]));
  ListBox2.Items.Objects[Index] := TObject(atom);
  fsModifiers := 0;
  if (Pos('Alt', SHotKey) > 0)
   then  fsModifiers := fsModifiers or MOD_ALT;
  if (Pos('Ctrl', SHotKey) > 0)
   then  fsModifiers := fsModifiers or MOD_CONTROL;
  if (Pos('Shift', SHotKey) > 0)
   then  fsModifiers := fsModifiers or MOD_SHIFT;
  vk := ord(SHotKey[Length(SHotKey)]);
// задание кодов F1 - F9
  if SHotKey[Length(SHotKey)-1] = 'F'
   then vk := vk + 63;
// задание кодов F10 - F12
  if SHotKey[Length(SHotKey)-2] = 'F'
   then vk := vk + 73;
  RegisterHotKey(Handle, atom, fsModifiers, vk);
end;

procedure TForm1.FormCreate(Sender: TObject);
var S: string;
begin
// к имени файла надо добавить текущий каталог,
// так как при вызове OpenDialog каталог может измениться,
// и если имя файла без пути, то файл будет формироваться в другом каталоге
 SFile := GetCurrentDir + '\' + SFile;
 AssignFile(F, SFile);
 if not FileExists(SFile) then begin
  // Создание файла, если его не было ранее
  Rewrite(F);
  Writeln(F, 'Время');
  Writeln(F, 'Ctrl+Alt+T');
  CloseFile(F);
 end;
 Reset(F);
 ListBox1.Clear;
 ListBox2.Clear;
 while not Eof(F) do
 begin
  Readln(F, S);
  ListBox1.Items.Add(S);
  Readln(F, S);
  Reg(ListBox2.Items.Add(S));
 end;
 CloseFile(F);
 ListBox1.ItemIndex := 0;
 ListBox1Click(ListBox1);
end;

procedure TForm1.WMHotKey(var a: TWMHotKey);
var S: string;
    i: word;
begin
 for i:=0 to ListBox2.Count -1 do
  if word(ListBox2.Items.Objects[i]) = a.HotKey
   then begin
    if ListBox1.Items[i] = 'Время'
    then begin
     DateTimeToString(S, 'Сегодня dddd'#13'd mmmm yyy года'#13'hh часов mm минут', Now);
     Form2.Label1.Caption := S;
     Form2.Visible := true;
     SetWindowPos(Form2.Handle, HWND_TOPMOST, 0, 0, 0, 0,
                   SWP_NOMOVE + SWP_NOSIZE);
    end
   else ShellExecute(Handle,nil,PChar(ListBox1.Items[i]),nil,nil,SW_RESTORE);
  end;
end;

procedure TForm1.BFoundClick(Sender: TObject);
begin
 if OpenDialog1.Execute
   then Edit1.Text := OpenDialog1.FileName;
end;

procedure TForm1.ListBox1Click(Sender: TObject);
begin
 Edit1.Text := ListBox1.Items[ListBox1.ItemIndex];
 HotKey1.HotKey := TextToShortCut(ListBox2.Items[ListBox1.ItemIndex]);
 ListBox2.ItemIndex := ListBox1.ItemIndex;
end;

procedure TForm1.BAddClick(Sender: TObject);
var SHotKey: string;
begin
  if HotKey1.HotKey = 0
  then begin
   ShowMessage('Вы не задали комбинацию горячих клавиш');
   exit;
  end;

  SHotKey := ShortCutToText(HotKey1.HotKey);
  if (ListBox2.Items.IndexOf(SHotKey) <> -1)
  then begin
   ShowMessage('Заданная комбинация горячих клавиш уже зарегистрирована');
   exit;
  end;

  if (ListBox1.Items.IndexOf(Edit1.Text) <> -1)
  then begin
   ShowMessage('Для этого действия комбинация горячих клавиш уже зарегистрирована');
   exit;
  end;
  ListBox1.Items.Add(Edit1.Text);
  Reg(ListBox2.Items.Add(ShortCutToText(HotKey1.HotKey)));
end;

procedure TForm1.BChangeClick(Sender: TObject);
begin
  if HotKey1.HotKey = 0
  then begin
   ShowMessage('Вы не задали комбинацию горячих клавиш');
   exit;
  end;

 UnRegisterHotKey(Handle,word(ListBox2.Items.Objects[ListBox1.ItemIndex]));
 ListBox1.Items[ListBox1.ItemIndex] := Edit1.Text;
 ListBox2.Items[ListBox1.ItemIndex] := ShortCutToText(HotKey1.HotKey);
 Reg(ListBox1.ItemIndex);
end;

procedure TForm1.BEraseClick(Sender: TObject);
begin
 UnRegisterHotKey(Handle,word(ListBox2.Items.Objects[ListBox1.ItemIndex]));
 ListBox2.Items.Delete(ListBox1.ItemIndex);
 ListBox1.Items.Delete(ListBox1.ItemIndex);
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var i: word;
begin
 Rewrite(F);
 for i:=0 to ListBox1.Count -1 do
 begin
  UnRegisterHotKey(Handle,word(ListBox2.Items.Objects[i]));
  Writeln(F, ListBox1.Items[i]);
  Writeln(F, ListBox2.Items[i]);
 end;
 CloseFile(F);
end;

end.
