home *** CD-ROM | disk | FTP | other *** search
/ BUG 15 / BUGCD1998_06.ISO / desktop / hotkey / hotkey95.exe / Source / hkEdit.pas < prev    next >
Pascal/Delphi Source File  |  1998-02-20  |  28KB  |  893 lines

  1. unit hkEdit;
  2.  
  3. interface
  4.  
  5. uses
  6.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  7.   ComCtrls, StdCtrls, WComp, SysHot, ShellAPI, AniTray, Menus, ExtCtrls, IniFiles,
  8.   Buttons, BrowseEdit;
  9.  
  10. const
  11.   WM_EDITKEYS = WM_USER+2001;
  12.   WM_SENDKEYS = WM_USER+2002;
  13.  
  14. type
  15.   TfrmHotkeyEdit = class(TForm)
  16.     lvHotkeys: TListView;
  17.     SysHotkeys: TSysHotKey;
  18.     ppmTrayMenu: TPopupMenu;
  19.     mnuEditHotkeys: TMenuItem;
  20.     mnuAbout: TMenuItem;
  21.     mnuSeparator2: TMenuItem;
  22.     mnuExit: TMenuItem;
  23.     atiHotkeys: TAnimatedTrayIcon;
  24.     pnlControls: TPanel;
  25.     pnlEdit: TPanel;
  26.     pnlButtons: TPanel;
  27.     btnNew: TButton;
  28.     btnDelete: TButton;
  29.     btnApply: TButton;
  30.     btnClose: TButton;
  31.     grpHotkey: TGroupBox;
  32.     lblDescription: TLabel;
  33.     lblCommandLine: TLabel;
  34.     lblHotkey: TLabel;
  35.     edtDescription: TEdit;
  36.     chkCtrl: TCheckBox;
  37.     chkAlt: TCheckBox;
  38.     chkShift: TCheckBox;
  39.     chkWin: TCheckBox;
  40.     cboHotkey: TComboBox;
  41.     chkActive: TCheckBox;
  42.     mnuListHotkeys: TMenuItem;
  43.     pnlOptions: TPanel;
  44.     chkShowIcon: TCheckBox;
  45.     mnuSeparator1: TMenuItem;
  46.     mnuHotkeys: TMenuItem;
  47.     lblAction: TLabel;
  48.     cboActions: TComboBox;
  49.     edtCommandLine: TBrowseEdit;
  50.     cboParams: TComboBox;
  51.     mnuHelp: TMenuItem;
  52.     mnuSeparator0: TMenuItem;
  53.     edtKeysToSend: TEdit;
  54.     opdOpenFile: TOpenDialog;
  55.     procedure btnNewClick(Sender: TObject);
  56.     procedure chkActiveClick(Sender: TObject);
  57.     procedure edtDescriptionChange(Sender: TObject);
  58.     procedure edtCommandLineChange(Sender: TObject);
  59.     procedure chkCtrlClick(Sender: TObject);
  60.     procedure FormCreate(Sender: TObject);
  61.     procedure lvHotkeysClick(Sender: TObject);
  62.     procedure btnDeleteClick(Sender: TObject);
  63.     procedure btnCloseClick(Sender: TObject);
  64.     procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  65.     procedure SysHotkeysHotKey(Sender: TObject; Index: Integer);
  66.     procedure FormDestroy(Sender: TObject);
  67.     procedure FormClose(Sender: TObject; var Action: TCloseAction);
  68.     procedure mnuEditHotkeysClick(Sender: TObject);
  69.     procedure mnuExitClick(Sender: TObject);
  70.     procedure btnApplyClick(Sender: TObject);
  71.     procedure FormResize(Sender: TObject);
  72.     procedure atiHotkeysEndAnimation(Sender: TObject);
  73.     procedure mnuAboutClick(Sender: TObject);
  74.     procedure mnuListHotkeysClick(Sender: TObject);
  75.     procedure chkShowIconClick(Sender: TObject);
  76.     procedure FormKeyDown(Sender: TObject; var Key: Word;
  77.       Shift: TShiftState);
  78.     procedure cboActionsClick(Sender: TObject);
  79.     procedure cboParamsClick(Sender: TObject);
  80.     procedure edtKeysToSendChange(Sender: TObject);
  81.     procedure mnuHelpClick(Sender: TObject);
  82.   private
  83.     Item: TListItem;
  84.     FChanged: Boolean;
  85.     Quitting, Ignore: Boolean;
  86.     CurModifiers: THKModifiers;
  87.     CurVirtKey  : TVirtKey;
  88.     CommandLines: TStringList;
  89.     procedure SetChanged(Value: Boolean);
  90.     function  HotkeyOK(sHotkey: String): Boolean;
  91.     procedure SetControls;
  92.   protected
  93.     property IsChanged: Boolean read FChanged write SetChanged;
  94.     procedure EditHotkeys;
  95.     procedure ViewHotkeys;
  96.     procedure AboutBox;
  97.     procedure HelpIndex;
  98.     function  VirtKey(sHotkey: String): TVirtKey;
  99.     function  Modifiers(sHotkey: String): THKModifiers;
  100.     procedure AddTo(var sKey: String; Value: String);
  101.     procedure SetItem;
  102.     procedure GetHotkey;
  103.     procedure SetHotkey;
  104.     procedure ReadHotkeys;
  105.     procedure SaveHotkeys;
  106.     procedure LoadHotkeys;
  107.     procedure wmGetMinMaxInfo(var Msg: TWMGETMINMAXINFO); message WM_GETMINMAXINFO;
  108.     procedure wmEditKeys(var Msg: TMessage); message WM_EDITKEYS;
  109.     procedure wmSendKeys(var Msg: TMessage); message WM_SENDKEYS;
  110.   public
  111.     function  ReadHotkey(Reader: TReader): String;
  112.     procedure HotkeyMenuClick(Sender: TObject);
  113.     procedure HotkeyPressed(Index: Integer);
  114.   end;
  115.  
  116. var
  117.   frmHotkeyEdit: TfrmHotkeyEdit;
  118.  
  119. implementation
  120.  
  121. {$R *.DFM}
  122.  
  123. uses hkAbout, hkList, hkError, hkSend;
  124.  
  125. const
  126.   Actives  : array[Boolean] of string = ('False', 'True');
  127.  
  128.   Params   : array[0..2] of String = ('Shutdown', 'Log off', 'Reboot');
  129.  
  130.   Actions  : array[0..6] of String = ('Execute Program', 'Send keystrokes',
  131.                                       'Exit Windows',    'Edit Hotkeys',
  132.                                       'View Hotkeys',    'Display About Box',
  133.                                       'Hotkeys Help');
  134.   ITEM_ACTION = 0;
  135.   ITEM_DATA   = 1;
  136.   ITEM_HOTKEY = 2;
  137.   ITEM_ACTIVE = 3;
  138.  
  139. procedure TfrmHotkeyEdit.lvHotkeysClick(Sender: TObject);
  140. begin
  141.   if lvHotkeys.Selected<>nil then
  142.    begin
  143.      Item := lvHotkeys.Selected;
  144.      grpHotkey.Caption := 'Edit hotkey';
  145.      SetItem;
  146.    end
  147.   else if Item<>nil then lvHotkeys.Selected := Item;
  148. end;
  149.  
  150. procedure TfrmHotkeyEdit.btnNewClick(Sender: TObject);
  151. begin
  152.   Item := lvHotkeys.Items.Add;
  153.   Item.SubItems.Add(cboActions.Items[0]);
  154.   Item.SubItems.Add('');
  155.   Item.SubItems.Add('');
  156.   Item.SubItems.Add('True');
  157.   grpHotkey.Caption := 'Add hotkey';
  158.   SetItem;
  159.   lvHotkeys.Selected := Item;
  160.   IsChanged := True;
  161. end;
  162.  
  163. procedure TfrmHotkeyEdit.SetItem;
  164. begin
  165.   Ignore := True;
  166.   edtDescription.Text := Item.Caption;
  167.   cboActions.ItemIndex := cboActions.Items.IndexOf(Item.SubItems[ITEM_ACTION]);
  168.   case cboActions.ItemIndex of
  169.     0 : edtCommandLine.Text := Item.SubItems[ITEM_DATA];
  170.     1 : edtKeysToSend.Text := Item.SubItems[ITEM_DATA];
  171.     2 : cboParams.ItemIndex := cboParams.Items.IndexOf(Item.SubItems[ITEM_DATA]);
  172.   end;
  173.   SetControls;
  174.   SetHotkey;
  175.   chkActive.Checked := (Item.SubItems[ITEM_ACTIVE] = 'True');
  176.   Ignore := False;
  177. end;
  178.  
  179. procedure TfrmHotkeyEdit.chkActiveClick(Sender: TObject);
  180. begin
  181.   if (Item<>nil) and not Ignore then
  182.    begin
  183.      if chkActive.Checked then Item.SubItems[ITEM_ACTIVE] := 'True' else Item.SubItems[ITEM_ACTIVE] := 'False';
  184.      IsChanged := True;
  185.    end;
  186. end;
  187.  
  188. procedure TfrmHotkeyEdit.edtDescriptionChange(Sender: TObject);
  189. begin
  190.   if (Item<>nil) and not Ignore then
  191.    begin
  192.      Item.Caption := edtDescription.Text;
  193.      IsChanged := True;
  194.    end;
  195. end;
  196.  
  197. procedure TfrmHotkeyEdit.edtCommandLineChange(Sender: TObject);
  198. begin
  199.   if (Item<>nil) and not Ignore then
  200.    begin
  201.      Item.SubItems[ITEM_DATA] := edtCommandLine.Text;
  202.      IsChanged := True;
  203.    end;
  204. end;
  205.  
  206. procedure TfrmHotkeyEdit.chkCtrlClick(Sender: TObject);
  207. begin
  208.   GetHotkey;
  209. end;
  210.  
  211. procedure TfrmHotkeyEdit.AddTo(var sKey: String; Value: String);
  212. begin
  213.   if sKey<>'' then sKey := sKey + '+';
  214.   sKey := sKey + Value;
  215. end;
  216.  
  217. function TfrmHotkeyEdit.HotkeyOK(sHotkey: String): Boolean;
  218. const
  219.   ErrorDescription = 'If you continue the hotkey combination for ''%s'' will not work.';
  220. var
  221.   i: Integer;
  222. begin
  223.   with lvHotkeys do
  224.    for i:=0 to Items.Count-1 do
  225.     if (Items[i]<>Item) and (Items[i].SubItems[ITEM_HOTKEY]=sHotkey) and (Items[i].SubItems[ITEM_ACTIVE]='True') then
  226.      with frmHotkeyError do
  227.       begin
  228.         ConflictingEntry := Items[i].Caption;
  229.         if Items[i].Index<Item.Index then
  230.          Description := Format(ErrorDescription, [Items[i].Caption])
  231.         else
  232.          Description := Format(ErrorDescription, [Item.Caption]);
  233.         Result := ShowModal = mrOk;
  234.         Exit;
  235.       end;
  236.   if not SysHotkeys.AddHotkey(Virtkey(sHotkey), Modifiers(sHotkey)).Registered then
  237.    begin
  238.      MessageBox(Handle, 'This hotkey combination is in use by another application.', 'Hotkey combination error', MB_ICONINFORMATION or MB_OK);
  239.      Result := False;
  240.    end
  241.   else
  242.    Result := True;
  243.   SysHotkeys.Delete(SysHotkeys.HotkeyCount-1);
  244. end;
  245.  
  246. procedure TfrmHotkeyEdit.GetHotkey;
  247. var
  248.   sHotkey: String;
  249. begin
  250.   sHotkey := '';
  251.   if (Item<>nil) and not Ignore then
  252.    begin
  253.      if chkCtrl.Checked then AddTo(sHotkey, 'Ctrl');
  254.      if chkAlt.Checked then AddTo(sHotkey, 'Alt');
  255.      if chkShift.Checked then AddTo(sHotkey, 'Shift');
  256.      if chkWin.Checked then AddTo(sHotkey, 'Win');
  257.      AddTo(sHotkey, cboHotkey.Items[cboHotkey.ItemIndex]);
  258.      if HotkeyOk(sHotkey) then
  259.       begin
  260.         Item.SubItems[ITEM_HOTKEY] := sHotkey;
  261.         IsChanged := True;
  262.       end
  263.      else
  264.       SetHotkey;
  265.    end;
  266.  
  267. end;
  268.  
  269. procedure TfrmHotkeyEdit.SetHotkey;
  270. var
  271.   sHotkey: String;
  272. begin
  273.   if Item<>nil then
  274.    begin
  275.      sHotkey := Item.SubItems[ITEM_HOTKEY];
  276.      CurVirtkey   := VirtKey(sHotkey);
  277.      CurModifiers := Modifiers(sHotkey);
  278.      chkCtrl.Checked := Pos('Ctrl', sHotkey)>0;
  279.      chkAlt.Checked := Pos('Alt', sHotkey)>0;
  280.      chkShift.Checked := Pos('Shift', sHotkey)>0;
  281.      chkWin.Checked := Pos('Win', sHotkey)>0;
  282.      while Pos('+', sHotkey)>0 do Delete(sHotkey, 1, Pos('+', sHotkey));
  283.      if sHotkey<>'' then
  284.       cboHotkey.ItemIndex := cboHotkey.Items.IndexOf(sHotkey)
  285.      else
  286.       cboHotkey.ItemIndex := -1;
  287.    end;
  288. end;
  289.  
  290. procedure TfrmHotkeyEdit.FormCreate(Sender: TObject);
  291. var
  292.   i : integer;
  293.   IniFile: String;
  294. begin
  295.   Application.ShowMainForm := False;
  296.   atiHotkeys.HideAppIcon;
  297.  
  298.   for i:= Low(Actions) to High(Actions) do cboActions.Items.Add(Actions[i]);
  299.   for i:=Low(Params) to High(Params) do cboParams.Items.Add(Params[i]);
  300.   cboParams.ItemIndex := 0;
  301.   Quitting := False;
  302.   Ignore := False;
  303.   CommandLines := TStringList.Create;
  304.   ReadHotkeys;
  305.   LoadHotkeys;
  306.   IniFile := ChangeFileExt(Application.ExeName, '.ini');
  307.   WindowState := wsNormal;
  308.   with TInifile.Create(IniFile) do
  309.    begin
  310.      chkShowIcon.Checked := ReadInteger('Settings', 'ShowTaskbarIcon', 1)=1;
  311.      chkShowIconClick(Self);
  312.      Width := ReadInteger('EditorWindow', 'Width', Width);
  313.      Height := ReadInteger('EditorWindow', 'Height',  Height);
  314.      for i:=0 to lvHotkeys.Columns.Count-1 do
  315.       with lvHotkeys.Columns[i] do
  316.        Width := ReadInteger('EWColumns', Caption, Width);
  317.      Free;
  318.    end;
  319. end;
  320.  
  321. function TfrmHotkeyEdit.ReadHotkey(Reader: TReader): String;
  322. begin
  323.   Result := '';
  324.   if Reader.ReadBoolean then AddTo(Result, 'Ctrl');
  325.   if Reader.ReadBoolean then AddTo(Result, 'Alt');
  326.   if Reader.ReadBoolean then AddTo(Result, 'Shift');
  327.   if Reader.ReadBoolean then AddTo(Result, 'Win');
  328.   AddTo(Result, cboHotKey.Items[Reader.ReadInteger]);
  329. end;
  330.  
  331. procedure TfrmHotkeyEdit.ReadHotkeys;
  332. var
  333.   Stream: TFileStream;
  334.   Reader: TReader;
  335.   Action,
  336.   Index : Integer;
  337. begin
  338.   if Item<>nil then Index := Item.Index else Index := 0;
  339.   lvHotkeys.Items.BeginUpdate;
  340.   try
  341.     Stream := TFileStream.Create(ChangeFileExt(Application.ExeName, '.hkd'), fmOpenRead);
  342.     try
  343.       Reader := TReader.Create(Stream, 4096);
  344.       try
  345.         lvHotkeys.Items.Clear;
  346.         Reader.ReadString; // version
  347.         Reader.ReadListBegin;
  348.         while not Reader.EndOfList do
  349.          begin
  350.            Item := lvHotkeys.Items.Add;
  351.            Item.Caption := Reader.ReadString;
  352.            Action := Reader.ReadInteger;
  353.            Item.SubItems.Add(cboActions.Items[Action]);
  354.            case Action of
  355.              0, 1: Item.SubItems.Add(Reader.ReadString);
  356.              2   : Item.SubItems.Add(cboParams.Items[Reader.ReadInteger]);
  357.              else  Item.SubItems.Add('');
  358.            end;
  359.            Item.SubItems.Add(ReadHotkey(Reader));
  360.            Item.SubItems.Add(Actives[Reader.ReadBoolean]);
  361.          end;
  362.         Reader.ReadListEnd;
  363.       finally
  364.         Reader.Free;
  365.       end;
  366.     finally
  367.       Stream.Free;
  368.     end;
  369.   except
  370.   end;
  371.   if lvHotkeys.Items.Count=0 then
  372.    btnNewClick(Self)
  373.   else
  374.    begin
  375.      lvHotkeys.Selected := lvHotkeys.Items[Index];
  376.      lvHotkeysClick(Self);
  377.      IsChanged := False;
  378.    end;
  379.   lvHotkeys.Items.EndUpdate;
  380. end;
  381.  
  382. procedure TfrmHotkeyEdit.SaveHotkeys;
  383. var
  384.   Stream: TFileStream;
  385.   Writer: TWriter;
  386.   i,
  387.   Index : Integer;
  388.   Hotkey: String;
  389. begin
  390.   try
  391.     Stream := TFileStream.Create(ChangeFileExt(Application.ExeName, '.hkd'), fmCreate);
  392.     try
  393.       Writer := TWriter.Create(Stream, 4096);
  394.       try
  395.         Writer.WriteString('Hotkey definitions, version 1.0');
  396.         Writer.WriteListBegin;
  397.         with lvHotkeys do
  398.          for i:=0 to Items.Count-1 do
  399.           begin
  400.             Writer.WriteString(Items[i].Caption);
  401.             Index := cboActions.Items.IndexOf(Items[i].SubItems[ITEM_ACTION]);
  402.             Writer.WriteInteger(Index);
  403.             case Index of
  404.               0, 1: Writer.WriteString(Items[i].SubItems[ITEM_DATA]);
  405.               2   : Writer.WriteInteger(cboParams.Items.IndexOf(Items[i].SubItems[ITEM_DATA]));
  406.             end;
  407.             Hotkey := Items[i].SubItems[ITEM_HOTKEY];
  408.             Writer.WriteBoolean(Pos('Ctrl',  Hotkey)>0);
  409.             Writer.WriteBoolean(Pos('Alt',   Hotkey)>0);
  410.             Writer.WriteBoolean(Pos('Shift', Hotkey)>0);
  411.             Writer.WriteBoolean(Pos('Win',   Hotkey)>0);
  412.             while Pos('+', Hotkey)>0 do Delete(Hotkey, 1, Pos('+', Hotkey));
  413.             Writer.WriteInteger(cboHotkey.Items.IndexOf(Hotkey));
  414.             Writer.WriteBoolean(Items[i].SubItems[ITEM_ACTIVE]=Actives[True]);
  415.           end;
  416.         Writer.WriteListEnd;
  417.       finally
  418.         Writer.Free;
  419.       end;
  420.     finally
  421.       Stream.Free;
  422.     end;
  423.   except
  424.   end;
  425.   IsChanged := False;
  426.   LoadHotkeys;
  427.   if Assigned(frmHotkeyList) and (frmHotkeyList.Visible) then frmHotkeyList.ReadHotkeys;
  428. end;
  429.  
  430. procedure TfrmHotkeyEdit.btnDeleteClick(Sender: TObject);
  431. begin
  432.   if Item<>nil then
  433.    begin
  434.      Item.Free;
  435.      if lvHotkeys.Items.Count>0 then
  436.       begin
  437.         lvHotkeys.Selected := lvHotkeys.Items[0];
  438.         lvHotkeysClick(Self);
  439.         IsChanged := True;
  440.       end
  441.      else
  442.       btnNewClick(Self);
  443.   end;
  444. end;
  445.  
  446. procedure TfrmHotkeyEdit.btnCloseClick(Sender: TObject);
  447. begin
  448.   Close;
  449. end;
  450.  
  451. procedure TfrmHotkeyEdit.FormCloseQuery(Sender: TObject;
  452.   var CanClose: Boolean);
  453. begin
  454.   if IsChanged then
  455.    case Application.MessageBox('Hotkey definitions have changed. Save changes?', 'Hotkey Editor', MB_ICONQUESTION or MB_YESNOCANCEL) of
  456.     IDYES: SaveHotkeys;
  457.     IDNO : begin
  458.              IsChanged := False;
  459.              ReadHotkeys;
  460.              LoadHotkeys;
  461.            end;
  462.     IDCANCEL: CanClose := False;
  463.    end;
  464. end;
  465.  
  466. procedure TfrmHotkeyEdit.LoadHotkeys;
  467. var
  468.   Stream       : TFileStream;
  469.   Reader       : TReader;
  470.   Action       : Integer;
  471.   sDescription,
  472.   sHotkey,
  473.   sCommandLine : String;
  474.   Item         : TMenuItem;
  475. begin
  476.   with SysHotkeys do
  477.    begin
  478.      try
  479.        try
  480.          Stream := TFileStream.Create(ChangeFileExt(Application.ExeName, '.hkd'), fmOpenRead);
  481.          try
  482.            Reader := TReader.Create(Stream, 4096);
  483.            try
  484.              CommandLines.Clear;
  485.              mnuEditHotkeys.Caption := '&Edit hotkeys...';
  486.              mnuListHotkeys.Caption := '&View hotkey list...';
  487.              mnuAbout.Caption := '&About...';
  488.              mnuHelp.Caption := 'Hotkeys &Help';
  489.              while mnuHotkeys.Count>0 do mnuHotkeys.Items[0].Free;
  490.              Clear;
  491.              Reader.ReadString; // version
  492.              Reader.ReadListBegin;
  493.              while not Reader.EndOfList do
  494.               begin
  495.                 sDescription := Reader.ReadString; // Hotkey description
  496.                 Action := Reader.ReadInteger;
  497.                 case Action of
  498.                   0, 1: sCommandLine := Reader.ReadString;            // Commandline
  499.                   2   : sCommandLine := IntToStr(Reader.ReadInteger); // Parameter
  500.                 end;
  501.                 sHotkey := ReadHotkey(Reader);
  502.                 if Reader.ReadBoolean and ((Action>1) or (sCommandLine<>'')) then
  503.                  begin
  504.                    CommandLines.Add(IntToStr(Action) + '=' + sCommandLine);
  505.                    AddHotkey(Virtkey(sHotkey), Modifiers(sHotkey));
  506.                    case Action of
  507.                      0: begin
  508.                           Item := NewItem(sDescription+#9+sHotkey, 0, False, True, HotkeyMenuClick, 0, '');
  509.                           Item.Tag := CommandLines.Count-1;
  510.                           mnuHotkeys.Add(Item);
  511.                         end;
  512.                      3: mnuEditHotkeys.Caption := '&Edit hotkeys...'+#9+sHotkey;
  513.                      4: mnuListHotkeys.Caption := '&View hotkey list...'+#9+sHotkey;
  514.                      5: mnuAbout.Caption := '&About...'+#9+sHotkey;
  515.                      6: mnuHelp.Caption := 'Hotkeys &Help'+#9+sHotkey;
  516.                    end;
  517.                  end;
  518.               end;
  519.              Reader.ReadListEnd;
  520.            finally
  521.              Reader.Free;
  522.            end;
  523.          finally
  524.            Stream.Free;
  525.          end;
  526.        finally
  527.          mnuHotkeys.Visible := mnuHotkeys.Count>0;
  528.          mnuSeparator1.Visible := mnuHotkeys.Count>0;
  529.        end;
  530.      except
  531.      end;
  532.    end;
  533. end;
  534.  
  535. function TfrmHotkeyEdit.VirtKey(sHotkey: String): TVirtKey;
  536. begin
  537.   Result := vkNone;
  538.   while Pos('+', sHotkey)>0 do Delete(sHotkey, 1, Pos('+', sHotkey));
  539.   case cboHotKey.Items.IndexOf(sHotkey) of
  540.      0: Result := vkBack;      // Backspace
  541.      1: Result := vkTab;       // Tab
  542.      2: Result := vkReturn;    // Return
  543.      3: Result := vkPause;     // Pause
  544.      4: Result := vkCapital;   // Capslock
  545.      5: Result := vkEscape;    // Escape
  546.      6: Result := vkSpace;     // Space
  547.      7: Result := vkPrior;     // PgUp
  548.      8: Result := vkNext;      // PgDn
  549.      9: Result := vkHome;      // Home
  550.     10: Result := vkEnd;       // End
  551.     11: Result := vkLeft;      // Left Arrow
  552.     12: Result := vkUp;        // Up Arrow
  553.     13: Result := vkRight;     // Right Arrow
  554.     14: Result := vkDown;      // Down Arrow
  555.     15: Result := vkSnapshot;  // PrintScreen
  556.     16: Result := vkInsert;    // Insert
  557.     17: Result := vkDelete;    // Delete
  558.     18: Result := vk0;         // 0
  559.     19: Result := vk1;         // 1
  560.     20: Result := vk2;         // 2
  561.     21: Result := vk3;         // 3
  562.     22: Result := vk4;         // 4
  563.     23: Result := vk5;         // 5
  564.     24: Result := vk6;         // 6
  565.     25: Result := vk7;         // 7
  566.     26: Result := vk8;         // 8
  567.     27: Result := vk9;         // 9
  568.     28: Result := vkA;         // A
  569.     29: Result := vkB;         // B
  570.     30: Result := vkC;         // C
  571.     31: Result := vkD;         // D
  572.     32: Result := vkE;         // E
  573.     33: Result := vkF;         // F
  574.     34: Result := vkG;         // G
  575.     35: Result := vkH;         // H
  576.     36: Result := vkI;         // I
  577.     37: Result := vkJ;         // J
  578.     38: Result := vkK;         // K
  579.     39: Result := vkL;         // L
  580.     40: Result := vkM;         // M
  581.     41: Result := vkN;         // N
  582.     42: Result := vkO;         // O
  583.     43: Result := vkP;         // P
  584.     44: Result := vkQ;         // Q
  585.     45: Result := vkR;         // R
  586.     46: Result := vkS;         // S
  587.     47: Result := vkT;         // T
  588.     48: Result := vkU;         // U
  589.     49: Result := vkV;         // V
  590.     50: Result := vkW;         // W
  591.     51: Result := vkX;         // X
  592.     52: Result := vkY;         // Y
  593.     53: Result := vkZ;         // Z
  594.     54: Result := vkNumpad0;   // Num 0
  595.     55: Result := vkNumpad1;   // Num 1
  596.     56: Result := vkNumpad2;   // Num 2
  597.     57: Result := vkNumpad3;   // Num 3
  598.     58: Result := vkNumpad4;   // Num 4
  599.     59: Result := vkNumpad5;   // Num 5
  600.     60: Result := vkNumpad6;   // Num 6
  601.     61: Result := vkNumpad7;   // Num 7
  602.     62: Result := vkNumpad8;   // Num 8
  603.     63: Result := vkNumpad9;   // Num 9
  604.     64: Result := vkMultiply;  // Num *
  605.     65: Result := vkAdd;       // Num +
  606.     66: Result := vkSubtract;  // Num -
  607.     67: Result := vkDecimal;   // Num .
  608.     68: Result := vkDivide;    // Num /
  609.     69: Result := vkF1;        // F1
  610.     70: Result := vkF2;        // F2
  611.     71: Result := vkF3;        // F3
  612.     72: Result := vkF4;        // F4
  613.     73: Result := vkF5;        // F5
  614.     74: Result := vkF6;        // F6
  615.     75: Result := vkF7;        // F7
  616.     76: Result := vkF8;        // F8
  617.     77: Result := vkF9;        // F9
  618.     78: Result := vkF10;       // F10
  619.     79: Result := vkF11;       // F11
  620.     80: Result := vkF12;       // F12
  621.     81: Result := vkF13;       // F13
  622.     82: Result := vkF14;       // F14
  623.     83: Result := vkF15;       // F15
  624.     84: Result := vkF16;       // F16
  625.     85: Result := vkF17;       // F17
  626.     86: Result := vkF18;       // F18
  627.     87: Result := vkF19;       // F19
  628.     88: Result := vkF20;       // F20
  629.     89: Result := vkF21;       // F21
  630.     90: Result := vkF22;       // F22
  631.     91: Result := vkF23;       // F23
  632.     92: Result := vkF24;       // F24
  633.     93: Result := vkNumlock;   // Numlock
  634.     94: Result := vkScroll;    // Scrolllock
  635.   end;
  636. end;
  637.  
  638. function TfrmHotkeyEdit.Modifiers(sHotkey: String): THKModifiers;
  639. begin
  640.   Result := [];
  641.   if Pos('Ctrl',  sHotkey) > 0 then Include(Result, hkCtrl);
  642.   if Pos('Alt',   sHotkey) > 0 then Include(Result, hkAlt);
  643.   if Pos('Shift', sHotkey) > 0 then Include(Result, hkShift);
  644.   if Pos('Win',   sHotkey) > 0 then Include(Result, hkExt);
  645. end;
  646.  
  647. procedure TfrmHotkeyEdit.SysHotkeysHotKey(Sender: TObject; Index: Integer);
  648. begin
  649.   HotkeyPressed(Index);
  650. end;
  651.  
  652. procedure TfrmHotkeyEdit.FormDestroy(Sender: TObject);
  653. var
  654.   i : integer;
  655. begin
  656.   CommandLines.Free;
  657.   with TInifile.Create(ChangeFileExt(Application.ExeName, '.ini')) do
  658.    begin
  659.      WriteInteger('EditorWindow', 'Width', Width);
  660.      WriteInteger('EditorWindow', 'Height',  Height);
  661.      for i:=0 to lvHotkeys.Columns.Count-1 do
  662.       with lvHotkeys.Columns[i] do
  663.        WriteInteger('EWColumns', Caption, Width);
  664.      Free;
  665.    end;
  666. end;
  667.  
  668. procedure TfrmHotkeyEdit.FormClose(Sender: TObject; var Action: TCloseAction);
  669. begin
  670.   if not Quitting then
  671.    begin
  672.      Action := caNone;
  673.      Hide;
  674.    end;
  675. end;
  676.  
  677. procedure TfrmHotkeyEdit.mnuEditHotkeysClick(Sender: TObject);
  678. begin
  679.   EditHotkeys;
  680. end;
  681.  
  682. procedure TfrmHotkeyEdit.wmEditKeys(var Msg: TMessage);
  683. begin
  684.   if Msg.wParam = WM_EDITKEYS then EditHotkeys;
  685. end;
  686.  
  687. procedure TfrmHotkeyEdit.EditHotkeys;
  688. begin
  689.   WindowState := wsNormal;
  690.   Show;
  691.   SetWindowPos(Handle, HWND_TOP, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE or SWP_SHOWWINDOW);
  692.   SetForeGroundWindow(Handle);
  693. end;
  694.  
  695. procedure TfrmHotkeyEdit.mnuExitClick(Sender: TObject);
  696. begin
  697.   Quitting := True;
  698.   Close;
  699. end;
  700.  
  701. procedure TfrmHotkeyEdit.SetChanged(Value: Boolean);
  702. begin
  703.   if FChanged<>Value then
  704.    begin
  705.      FChanged := Value;
  706.      if FChanged then SysHotkeys.Clear;
  707.      btnApply.Enabled := FChanged;
  708.    end;
  709. end;
  710.  
  711.  
  712. procedure TfrmHotkeyEdit.btnApplyClick(Sender: TObject);
  713. begin
  714.   SaveHotkeys;
  715. end;
  716.  
  717. procedure TfrmHotkeyEdit.FormResize(Sender: TObject);
  718. begin
  719.   cboHotkey.Width := ClientWidth - 376;
  720.   edtDescription.Width := ClientWidth - 184;
  721.   edtKeysToSend.Width := ClientWidth - 184;
  722.   cboActions.Width := ClientWidth - 184;
  723.   cboParams.Width := ClientWidth - 184;
  724.   edtCommandLine.Width := ClientWidth - 184;
  725. end;
  726.  
  727. procedure TfrmHotkeyEdit.wmGetMinMaxInfo(var Msg: TWMGETMINMAXINFO);
  728. begin
  729.   Msg.MinMaxInfo^.ptMinTrackSize.X := 411;
  730.   Msg.MinMaxInfo^.ptMinTrackSize.Y := 244;
  731. end;
  732.  
  733. procedure TfrmHotkeyEdit.atiHotkeysEndAnimation(Sender: TObject);
  734. begin
  735.   atiHotkeys.Style := tsNormal;
  736. end;
  737.  
  738. procedure TfrmHotkeyEdit.mnuAboutClick(Sender: TObject);
  739. begin
  740.   AboutBox;
  741. end;
  742.  
  743. procedure TfrmHotkeyEdit.AboutBox;
  744. begin
  745.   frmAbout.Show;
  746.   SetForeGroundWindow(frmAbout.Handle);
  747. end;
  748.  
  749. procedure TfrmHotkeyEdit.ViewHotkeys;
  750. begin
  751.   frmHotkeyList.Show;
  752.   SetForeGroundWindow(frmHotkeyList.Handle);
  753. end;
  754.  
  755. procedure TfrmHotkeyEdit.mnuListHotkeysClick(Sender: TObject);
  756. begin
  757.   ViewHotkeys;
  758. end;
  759.  
  760. procedure TfrmHotkeyEdit.HotkeyMenuClick(Sender: TObject);
  761. begin
  762.   HotkeyPressed(TMenuItem(Sender).Tag);
  763. end;
  764.  
  765. procedure TfrmHotkeyEdit.HotkeyPressed(Index: Integer);
  766. const
  767.   Flags: array[0..2] of integer = (EWX_SHUTDOWN, EWX_LOGOFF, EWX_REBOOT);
  768. var
  769.   Action : Integer;
  770.   Command: String;
  771. begin
  772.   if Index>CommandLines.Count then Exit;
  773.   if CommandLines[Index]<>'' then
  774.    begin
  775.      atiHotkeys.Style := tsAnimated;
  776.      Action := StrToInt(CommandLines[Index][1]);
  777.      Command := Copy(CommandLines[Index], 3, Length(CommandLines[Index]));
  778.      case Action of
  779.        0: WinExec(PChar(Command), SW_SHOW);
  780.        1: PostMessage(Handle, WM_SENDKEYS, WM_SENDKEYS, Index);
  781.        2: ExitWindowsEx(Flags[StrToInt(Command)], 0);
  782.        3: EditHotkeys;
  783.        4: ViewHotkeys;
  784.        5: AboutBox;
  785.        6: HelpIndex;
  786.      end;
  787.    end;
  788. end;
  789.  
  790. procedure TfrmHotkeyEdit.wmSendKeys(var Msg: TMessage);
  791. var
  792.   Keys: String;
  793. begin
  794.   if Msg.wParam=WM_SENDKEYS then
  795.    begin
  796.      Keys := CommandLines[Msg.lParam];
  797.      Delete(Keys,1, 2);
  798.      SendKeys(Keys);
  799.    end;
  800. end;
  801.  
  802.  
  803. procedure TfrmHotkeyEdit.chkShowIconClick(Sender: TObject);
  804. begin
  805.   atiHotkeys.Active := chkShowIcon.Checked;
  806.   with TInifile.Create(ChangeFileExt(Application.ExeName, '.ini')) do
  807.    begin
  808.      if chkShowIcon.Checked then
  809.       WriteInteger('Settings', 'ShowTaskbarIcon', 1)
  810.      else
  811.       WriteInteger('Settings', 'ShowTaskbarIcon', 0);
  812.      Free;
  813.    end;
  814. end;
  815.  
  816. procedure TfrmHotkeyEdit.FormKeyDown(Sender: TObject; var Key: Word;
  817.   Shift: TShiftState);
  818. begin
  819.   if Key=VK_F1 then
  820.    WinHelp(Handle, PChar(ChangeFileExt(Application.ExeName, '.hlp')+'>EditWnd'), HELP_CONTEXT, 3);
  821. end;
  822.  
  823. procedure TfrmHotkeyEdit.SetControls;
  824. var
  825.   Index : Integer;
  826. begin
  827.   Index := cboActions.ItemIndex;
  828.   edtCommandLine.Visible := (Index=0);
  829.   edtKeysToSend.Visible := (Index=1);
  830.   cboParams.Visible := (Index=2);
  831.   lblCommandLine.Visible := Index<3;
  832.   case Index of
  833.     0 : begin
  834.           lblCommandLine.Caption := 'Co&mmandline:';
  835.           lblCommandLine.FocusControl := edtCommandLine;
  836.         end;
  837.     1 : begin
  838.           lblCommandLine.Caption := '&Keys to send:';
  839.           lblCommandLine.FocusControl := edtKeysToSend;
  840.         end;
  841.     2 : begin
  842.           lblCommandLine.Caption := 'Para&meters';
  843.           lblCommandLine.FocusControl := cboParams;
  844.         end;
  845.   end;
  846. end;
  847.  
  848. procedure TfrmHotkeyEdit.cboActionsClick(Sender: TObject);
  849. begin
  850.   if Item.SubItems[ITEM_ACTION] <> cboActions.Items[cboActions.ItemIndex] then
  851.    begin
  852.      Item.SubItems[ITEM_ACTION] := cboActions.Items[cboActions.ItemIndex];
  853.      case cboActions.ItemIndex of
  854.        0: Item.SubItems[ITEM_DATA] := edtCommandLine.Text;
  855.        1: Item.SubItems[ITEM_DATA] := edtKeysToSend.Text;
  856.        2: Item.SubItems[ITEM_DATA] := cboParams.Items[cboParams.ItemIndex];
  857.        else Item.SubItems[ITEM_DATA] := '';
  858.      end;
  859.      IsChanged := True;
  860.      SetControls;
  861.    end;
  862. end;
  863.  
  864. procedure TfrmHotkeyEdit.HelpIndex;
  865. begin
  866.   WinHelp(Handle, PChar(ChangeFileExt(Application.ExeName, '.hlp')), HELP_CONTENTS, 0);
  867. end;
  868.  
  869. procedure TfrmHotkeyEdit.cboParamsClick(Sender: TObject);
  870. begin
  871.   if Item.SubItems[ITEM_DATA] <> cboParams.Items[cboParams.ItemIndex] then
  872.    begin
  873.      Item.SubItems[ITEM_DATA] := cboParams.Items[cboParams.ItemIndex];
  874.      IsChanged := True;
  875.    end;
  876. end;
  877.  
  878. procedure TfrmHotkeyEdit.edtKeysToSendChange(Sender: TObject);
  879. begin
  880.   if (Item<>nil) and not Ignore then
  881.    begin
  882.      Item.SubItems[ITEM_DATA] := edtKeysToSend.Text;
  883.      IsChanged := True;
  884.    end;
  885. end;
  886.  
  887. procedure TfrmHotkeyEdit.mnuHelpClick(Sender: TObject);
  888. begin
  889.   HelpIndex;
  890. end;
  891.  
  892. end.
  893.