设定的全局快捷键总是自动消失
delphi吧
全部回复
仅看楼主
level 11
chinasea2012 楼主
使用了如下代码,我设置了4个快捷键,没用几次就不能使用了,不知道有什么要注意的:
delphi程序中定义热键
核心提示: 用到3个API函数BOOL RegisterHotKey ( HWND hWnd, //响应该热键的窗口句柄 Int id, //该热键的唯一标识 UINT fsModifiers, //该
用到3个API函数 BOOL RegisterHotKey

HWND hWnd,
//响应该热键的窗口句柄
Int id,
//该热键的唯一标识
UINT fsModifiers,
//该热键的辅助按键
UINT vk
//该热键的键值
);
为了得到唯一标识,我们还将用到另一个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。
上面 的代码注册了一个热键:ALT+F8。当然如果你希望象TAKEIT那样,只用F8, 就这么写:
RegisterHotKey(Handle, hotkeyid, 0, VK_F8);
注:handle是一个特殊的变量,它表示当前窗口的句柄。
这个函数你应该能句举一反三了吧。
2017年07月20日 07点07分 1
level 11
chinasea2012 楼主
还有更方便的定义快捷键方法吗?
2017年07月24日 07点07分 2
level 13
registerhotkey globaladdatom unregisterhotkey
只看到你用到前面2个,最后那个没见你用。
在窗口创建时候注册registerhotkey,在窗口销毁时unregisterhotkey。
按这个套路,不会出现设定的快捷键消失的情况。
关键点在于:热键只注册一次,不要出现多次注册的情况,同时,窗口退出时,一定要销毁注册的热键,否则下次注册时,就可能出现hotkeyid注册不上的情况。
2017年07月24日 16点07分 3
level 11
chinasea2012 楼主
上面是例子,下面是我定义的,有问题吗?
id1:=globaladdatom('hotkey1');
registerhotkey(handle,id1,mod_control,ord('1');
id2:=globaladdatom('hotkey2');
registerhotkey(handle,id2,mod_control,ord('2');
id3:=globaladdatom('hotkey3');
registerhotkey(handle,id3,mod_control,ord('3');
id4:=globaladdatom('hotkey4');
registerhotkey(handle,id4,mod_control,ord('4');
2017年07月26日 01点07分 4
level 11
chinasea2012 楼主
继续顶上,有没有老师指导下
2017年09月28日 02点09分 5
level 12
你自己写的:【1楼】
【第一步:
在窗口的create事件中,加入以下代码
HotKeyId := GlobalAddAtom(‘MyHotKey‘) - $C000;
注: HotKeyId的合法取之范围是0x0000到0xBFFF之间, GlobalAddAtom函数得到的值 在0xC000到0xFFFF之间,所以减掉0xC000来满足调用要求。】
【4楼】
【上面是例子,下面是我定义的,有问题吗?
id1:=globaladdatom('hotkey1');
registerhotkey(handle,id1,mod_control,ord('1');
id2:=globaladdatom('hotkey2');
registerhotkey(handle,id2,mod_control,ord('2');
id3:=globaladdatom('hotkey3');
registerhotkey(handle,id3,mod_control,ord('3');
id4:=globaladdatom('hotkey4');
registerhotkey(handle,id4,mod_control,ord('4');】
每一个globaladdatom的值-$C000跑哪儿去了?!而且为什么要减你自己复制粘贴得不是很明白么?!
2017年10月09日 07点10分 6
4楼我是手工录入,程序中已经是-$c000,但是有时还是会消失。
2017年10月09日 07点10分
@chinasea2012 检查API的返回值,再配合GetLastError看ID的值是不是在取值范围内
2017年10月10日 06点10分
1