1.全局或者局部的组合快捷键
如果是全局和局部的,那么用主窗体上(或其他控件上)(form)的KeyPress等属性进行监控。
2. 如果是系统级的,那么需要API了.
1>BOOL RegisterHotKey(HWND hWnd, Int id, UINT fsModifiers, UINT vk );
HWND //响应该热键的窗口句柄
Int //该热键的唯一标识
UINT //该热键的辅助按键
UINT //该热键的键值
热键的辅助按键包括Mod_Ctrl 、Mod_Alt、Mod_Shift,对于Windows兼容键盘还支
持Windows键,即其键面上有Windows标志的那个键,其值为Mod_win。
2>为了得到唯一标识,我们还将用到另一个API函数
ATOM GlobalAddAtom( LPCTSTR lpString);
LPCTSTR lpString //自己设定的一个字符串
3>.注销热键, 释放资源。
UnRegisterHotKey(HWND hWnd, Int id); //注销HotKey, 释放资源。
3.系统级快捷键设置的步骤:
1>.设置全局变量:
因为我们还要在程序退出的时候,消除这个热键, 所以需要声明一个全局变量:
HotKeyId: Integer;
2>. 在窗口的create事件中,加入以下代码
HotKeyId := GlobalAddAtom('MyHotKey') - $C000;
注意: HotKeyId的合法取之范围是0x0000到0xBFFF之间, GlobalAddAtom函数得到的值在
0xC000到0xFFFF之间,所以减掉0xC000来满足调用要求。
RegisterHotKey(Handle, hotkeyid, MOD_ALT, VK_F8); //注册了一个热键:ALT+F8。
注:handle是一个特殊的变量,它表示当前窗口的句柄。只用F8, 就这么写:
RegisterHotKey(Handle, hotkeyid, 0, VK_F8);
Windows发送消息的原理:
一旦热键设置成功,在程序应用过程中如果有相应的键被按下,Windows系统都会给你的应用
程序发送一个消息WM_HOTKEY,不管你的应用程序是否为当前活动的。其中
WM_HOTKEY消息的格式为:
idHotKey = (int) wParam; // 该参数在设置系统级的热键有用,一般不予使用
fuModifiers = (UINT) LOWORD(lParam); //热键的辅助按键
uVirtKey = (UINT) HIWORD(lParam); //热键的键值
3>.响应代码
声明函数: 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
ShowMessage('F8');
end;
end;
4>.在窗口的close事件中加入
UnRegisterHotKey(handle, HotKeyId); //注销HotKey, 释放资源。
4.相应的代码
private:
procedure HotKeyDown(var Msg: Tmessage); message WM_HOTKEY;
var
HotKeyId: Integer;
procedure TMainForm.btn1Click(Sender: TObject);
begin
HotKeyId := GlobalAddAtom('MyHotKey') - $C000;
RegisterHotKey(Handle, hotkeyid, 0, VK_F8);
end;
procedure TMainForm.btn2Click(Sender: TObject);
begin
UnRegisterHotKey(handle, HotKeyId); //注销HotKey, 释放资源。
end;
procedure Tfmain.HotKeyDown(var Msg: Tmessage);
begin
if (Msg.LparamLo = MOD_ALT) AND (Msg.LParamHi = VK_F8 then) // 假设热键为ALT+F8
begin
ShowMessage('F8');
end;
end;