用DELPHI如何注册系统级热键

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    procedure WMHotKey(var Msg: TWMHotKey); message WM_HOTKEY;
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

var
  HotKeyId: array[0..12] of Integer; //热键数组, 这里准备定义 13 个热键

procedure TForm1.FormCreate(Sender: TObject);
var
  i: Integer;
begin
//注册热键
  for i := Low(HotKeyId) to High(HotKeyId) do
    HotKeyId[i] := GlobalAddAtom(PChar(IntToStr(i))); //热键命名可随意
  RegisterHotKey(Handle,HotKeyId[0],0,VK_F2);               //F2
  RegisterHotKey(Handle,HotKeyId[1],0,VK_UP);               //Up
  RegisterHotKey(Handle,HotKeyId[2],0,VK_DOWN);             //Down
  RegisterHotKey(Handle,HotKeyId[3],0,VK_LEFT);             //Left
  RegisterHotKey(Handle,HotKeyId[4],0,VK_RIGHT);            //Right
  RegisterHotKey(Handle,HotKeyId[5],0,VK_PRIOR);            //PageUp
  RegisterHotKey(Handle,HotKeyId[6],0,VK_NEXT);             //PageDown
  RegisterHotKey(Handle,HotKeyId[7],0,VK_OEM_PLUS);         //+
  RegisterHotKey(Handle,HotKeyId[8],0,VK_OEM_MINUS);        //-
  RegisterHotKey(Handle,HotKeyId[9],0,$31);                 //1
  RegisterHotKey(Handle,HotKeyId[10],0,$41);                //a
  RegisterHotKey(Handle,HotKeyId[11],0,VK_RETURN);          //Enter
  RegisterHotKey(Handle,HotKeyId[12],MOD_CONTROL,VK_RETURN); //Ctrl+Enter
end;

//热键
procedure TForm1.WMHotKey(var Msg: TWMHotKey);
begin
  if Msg.HotKey = HotKeyId[0] then ShowMessage('F2');
  if (Msg.HotKey=HotKeyId[1]) then ShowMessage('Up');
  if (Msg.HotKey=HotKeyId[2]) then ShowMessage('Down');
  if (Msg.HotKey=HotKeyId[3]) then ShowMessage('Left');
  if (Msg.HotKey=HotKeyId[4]) then ShowMessage('Right');
  if Msg.HotKey = HotKeyId[5] then ShowMessage('PageUp');
  if Msg.HotKey = HotKeyId[6] then ShowMessage('PageDown');
  if Msg.HotKey = HotKeyId[7] then ShowMessage('+');
  if Msg.HotKey = HotKeyId[8] then ShowMessage('-');
  if Msg.HotKey = HotKeyId[9] then ShowMessage('1');
  if Msg.HotKey = HotKeyId[10] then ShowMessage('a');
  if Msg.HotKey = HotKeyId[11] then ShowMessage('Enter');
  if Msg.HotKey = HotKeyId[12] then ShowMessage('Ctrl+Enter');
end;

procedure TForm1.FormDestroy(Sender: TObject);
var
  i: Integer;
begin
//注销热键
  for i := Low(HotKeyId) to High(HotKeyId) do
  begin
    UnRegisterHotKey(handle,HotKeyId[i]);
    GlobalDeleteAtom(HotKeyId[i]);
  end;
end;

end.

***************************************************

这里是一些常用按键的键值

***************************************************

RegisterHotKey(Handle, hotkeyid, MOD_ALT, VK_F8); 

热键的辅助按键包括Mod_Ctrl 、Mod_Alt、Mod_Shift,对于Windows兼容键盘还支持Windows
键,即其键面上有Windows标志的那个键,其值为Mod_win。

部分热键:       

MOD_ALT      Alt   键
MOD_CONTROL Ctrl 键
MOD_SHIFT    Shift 键       

Back           008                Enter          013      

Shift          016                Ctrl           017
Alt            018                Pause          019
Caps Lock      020                Esc            027
空格键         032                Page Up        033
Page Down      034                End            035
Home           036                方向左         037
方向上         038                方向右         039
方向下         040                Insert         045
Delete         046                0 - 9          048 - 57
A - Z          065 - 090          数字键盘0-9    096 - 105
数字键盘*      106                数字键盘+      107
数字键盘-      109                数字键盘.      110
数字键盘/      111                F1 - F12       112 - 123
Num Lock       144                Soroll Lock    145
;              186                =              187
,              188                -              189
.              190                /              191
~              192                [              219
\              220                ]              221
'              222

上面 的代码注册了一个热键:ALT+F8。当然如果你希望象TAKEIT那样,只用F8, 就这么写:

RegisterHotKey(Handle, hotkeyid, 0, VK_F8); 

 

你可能感兴趣的:(Delphi)