用DELPHI如何注册系统热键

转载 2008年04月14日 16:38:00

下为转贴

用到3个API函数
1、
BOOL RegisterHotKey(
HWND hWnd,  //响应该热键的窗口句柄
Int id,      //该热键的唯一标识
UINT fsModifiers, //该热键的辅助按键
UINT vk    //该热键的键值
);
2、
为了得到唯一标识,我们还将用到另一个API函数

ATOM GlobalAddAtom(

LPCTSTR lpString //自己设定的一个字符串

);

因为我们还要在程序退出的时候,消除这个热键, 所以需要声明一个全局变量:

HotKeyId: Integer;



  第一步:

在窗口的create事件中,加入以下代码

HotKeyId := GlobalAddAtom(‘MyHotKey’) - $C000;
注: HotKeyId的合法取之范围是0x0000到0xBFFF之间, GlobalAddAtom函数得到的值
在0xC000到0xFFFF之间,所以减掉0xC000来满足调用要求。

  第二步:

在上面的代码下面加入:

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); 

注:handle是一个特殊的变量,它表示当前窗口的句柄。

这个函数你应该能句举一反三了吧。

原理:

一旦热键设置成功,在程序应用过程中如果有相应的键被按下,Windows系统都会给你的应
用程序发送一个消息WM_HOTKEY,不管你的应用程序是否为当前活动的。其中WM_HOTKEY消
息的格式为:
 


  idHotKey = (int) wParam; // 该参数在设置系统级的热键有用,一般不予使用
  fuModifiers = (UINT) LOWORD(lParam); //热键的辅助按键
  uVirtKey = (UINT) HIWORD(lParam); //热键的键值

  第三步:

注册了热键,就该写下响应代码了。

首先,在程序头部分的private段中加入声明 (作用是声明这个过程,和声明变量类似。
关于如何声明函数、过程,请请参考各自的帮助文件或其它资料):

procedure HotKeyDown(var Msg: Tmessage); message WM_HOTKEY;

然后在程序中加入如下代码:

procedure Tfmain.HotKeyDown(var Msg: Tmessage);
begin
if (Msg.LparamLo = MOD_ALT) AND Msg.LParamHi = VK_F8 then // 假设热键为ALT+F8
begin
end;
end;

  最后一步:

在窗口的close事件中加入

UnRegisterHotKey(handle, HotKeyId); //注销HotKey, 释放资源。 

以下为补充源码:

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    procedure xpq(var keyxx: TMessage);  message WM_HOTKEY;
  end;

var
  Form1: TForm1;
  HotKeyid:Integer;
implementation

{$R *.dfm}

Procedure TForm1.xpq(Var keyxx:Tmessage); //message WM_HOTKEY;  //用 registerhotkey 函数指定的键被按下时所热行的过程。
begin

  //此处为处理消息

end;
procedure TForm1.FormCreate(Sender: TObject);
begin
 HotKeyid:=GlobalAddAtom(pchar('qqp_528MessageKey'));
 //registerhotkey(handle,hotkeyid,mod_Alt,032); //注册的消息为Alt+空格

  registerhotkey(handle,hotkeyid,MOD_CONTROL or mod_Alt,066); //Ctrl+Alt+B
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  unregisterhotkey(handle,hotkeyid);    //释放热键所占用的资源。
  DeleteAtom(hotKeyID);                 //销毁所创建的原子。
end;

end.

 

delphi热键设定的方法

问题是你要全局的.还是要系统级的,还是要局部的。 如果是全局和局部的,那么在主窗体上(或其他控件上)(form)的KeyPress等属性上监控就行了.. 如果是系统级的,那么需要API...
  • aTian2009
  • aTian2009
  • 2012年01月20日 16:01
  • 781

Delphi全局热键注册

private { Private declarations } Aatom: ATOM; procedure hotkey(var msg: TMessage); messa...
  • gfuchao
  • gfuchao
  • 2016年07月28日 17:21
  • 246

delphi实现全局快捷键的功能

没什么复杂的,只是最近才用,跟大家分享一下     全局快捷键就是焦点不在这个系统时也管用的快捷键     1、首先需要注册快捷键 [delphi] view plain...
  • u013408061
  • u013408061
  • 2017年07月21日 14:44
  • 378

Delphi 快捷键 让你更像高手!! (form DFW)

>>代码模板 : CTRL+J >>代码整块移动 : CTRL+SHIFT+I(右移) CTRL+SHIFT+U(左移)>>选中窗体 : 先选中任一控件,SHIFT+鼠标左键>>将鼠标指向变量名、单元...
  • wwcz898
  • wwcz898
  • 2006年04月21日 09:01
  • 1634

python热键模块

  • 2012年02月20日 21:16
  • 2KB
  • 下载

Python:通过自定义系统级快捷键来控制程序运行

晚上学习了下python定义系统级快捷键的方法,这里说的系统级快捷键指的是,如果当前程序窗口不为激活窗口,也能收到快捷键消息,实现的是一个控制键盘和鼠标监听的程序,如,按下Ctrl + F3,程序开始...
  • dyx1024
  • dyx1024
  • 2012年03月09日 01:12
  • 9647

python库:pyhk,可用于注册快捷键(py2.7)

  • 2014年12月13日 22:45
  • 7KB
  • 下载

注册热键及使用方法

作者:古典小说网 头条:讨厌编程  、 古典古韵古典小说 作品:快乐课堂软件、任性动图软件、古典小说大全 定义 HACCEL m_hAccelerator;// 加速...
  • shuilan0066
  • shuilan0066
  • 2017年11月20日 11:17
  • 110

Delphi RegisterHotKey 设置系统热键

首先先贴一张热键表 Symbolic constant name Value (hexadecimal) Keyboard (or mouse) equivalent ...
  • yanjiaye520
  • yanjiaye520
  • 2012年08月22日 15:33
  • 4310

不用注册热键方式在Delphi中实现定义快捷键

第一步:在要实现快捷键的窗体中更改属性“KeyPreview”为True;第二步:在要实现快捷键的窗体中的OnKeyPress事件中填入一个过程名称(在Object Inspector中),填写好后...
  • chaijunkun
  • chaijunkun
  • 2009年04月26日 15:13
  • 4203
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用DELPHI如何注册系统热键
举报原因:
原因补充:

(最多只允许输入30个字)