社区
非技术区
帖子详情
注册系统级热键的问题
delfans
2002-01-31 10:24:00
我想在我的程序中给windows注册一个系统级热键如Ctrl+Shirt+C,让这个热键执行与Ctrl+C一样的复制操作,并且在所有程序中都能使用这个热键
怎么能实现?
...全文
44
2
打赏
收藏
注册系统级热键的问题
我想在我的程序中给windows注册一个系统级热键如Ctrl+Shirt+C,让这个热键执行与Ctrl+C一样的复制操作,并且在所有程序中都能使用这个热键 怎么能实现?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
2 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
chendaiyin
2002-05-05
打赏
举报
回复
为程序建立热键:
在一个应用程序内部菜单、部件都可以设置敏感键。如在菜单中一般用Alt+F进入“文件”之类的子菜单。另外我们在桌面上设置的快捷方式里的快捷键,无论你任何时候按下你所设置的快捷键就会启动相应的应用程序。在多个正在运行的应用程序中如何利用一个按键动作迅速地回到你所需要的应用程序呢?这就需要利用敏感键(HOTKEY)的技术来实现。本文利用Delphi3.0开发工具来阐述该技术在应用程序的实现方法。
一、敏感键的设置
在windows Api中有一个函数RegisterHotKey用于设置敏感键,它的调用方式如下:
BOOL RegisterHotKey(
HWND hWnd, //响应该敏感键的窗口句柄
Int id, //该敏感键的唯一标示符
UINT fsModifiers, //该敏感键的辅助按键
UINT vk //该敏感键的键值
);
其中敏感键的唯一标示符在Window中规定应用程序的取值范围为0x0000到0xBFFF之间,动态链接库的取值范围为0xC000到0xFFFF之间。为了保证其唯一性建议使用GlobalAddAtom函数来设置敏感键的唯一标示符。需要注意的是GlobalAddAtom还回的值是在0xC000到0xFFFF范围之间,为满足RegisterHotKey的调用要求,如果是在应用程序中设置敏感键可以利用GlobalAddAtom还回值减去0xC000。
敏感键的辅助按键包括Mod_Ctrl 、Mod_Alt、Mod_Shift,对于Windows兼容键盘还支持Windows键,即其键面上有Windows标志的那个键,其值为Mod_win。
在Delphi中建立一个“New Application”,在Tform1中的Private段中加入如下代码
private
{ Private declarations }
hotkeyid :integer;
procedure WMhotkeyhandle(var msg:Tmessage);
message wm_hotkey; //响应敏感键按键消息
在FormCreate事件中加入如下代码
…
hotkeyid:=GlobalAddAtom(pchar
(“UserDefineHotKey”))-$C000;
//减去$C000是为了保证取值范围的限制
registerhotkey(handle,hotkeyid,
MOD_CONTROL or mod_Altt,$41);
//敏感键为ctrl+Alt+A
…
二、敏感键的响应
一旦敏感键设置成功,在程序应用过程中如果有相应敏感键被按下,Windows系统都会给你的应用程序发送一个消息WM_HOTKEY,不管你的应用程序是否为当前活动的。其中WM_HOTKEY消息的格式为:
idHotKey = (int) wParam;
// 该参数在设置系统级的敏感键有用,一般不予使用
fuModifiers = (UINT) LOWORD(lParam);
//敏感键的辅助按键
uVirtKey = (UINT) HIWORD(lParam);
//敏感键的键值
因为Windows系统只是把一个WM_HotKey的消息发送给应用程序,要完成具体的事情需要一个消息处理程序,也就是上面Private段里的procedure WMhotkeyhandle(var msg:Tmessage); message wm_hotkey; 过程, 它的代码如下(这里只是简单地把窗口最前面显示)
procedure TForm1.Wmhotkeyhandle
(var msg:Tmessage);
begin
if (msg.LParamHi=$41) and
(msg.lparamLo=MOD_CONTROL or mod_Alt) then
begin
msg.Result:=1; //该消息已经处理
application.BringToFront;
//把窗口最前面显示
end;
end;
三、敏感键的释放
在应用程序退出来之前应当把你所设置的敏感键释放掉,以释放其所占有的系统资源,这里需要调用两个Windows API函数UNREGISTERHOTKEY,它的调用格式如下:
BOOL UNREGISTERHOTKEY(
HWND HWND, //与敏感键关联的窗口句柄
INT ID //敏感键的标示符
);
也就是说只要在FormClose事件中加入如下代码
…
unregisterhotkey(handle,hotkeyid);
DeleteAtom(HotKeyID);
…
到这里为止,你应当对敏感键技术有了全面的了解, 以上的例子相当简单同时也没有提供必要的调用成功检测,可以根据具体情况加以完善,希望对你的开发过程会有所帮助.
jarjarbink
2002-01-31
打赏
举报
回复
这个简单
比如使用Win32 API:
RegisterHotKey(Handle, 0, MOD_CONTROL or MOD_WIN, Cardinal('H'));
RegisterHotKey(Handle, 1, MOD_CONTROL or MOD_SHIFT, Cardinal('S'));
就注册了2个系统热键Ctrl+Win+H和Ctrl+SHIFT+S,代号分别是0和1,Handle是Form的句柄
使用
UnregisterHotKey(Handle, 0);
UnregisterHotKey(Handle, 1);
就把这两个热键删除了
你必须在Form的成员函数里写一个消息函数来响应这些个热键消息
比如加上
TForm1 = class(TForm)
...
private
{ Private declarations }
...
procedure WMHotKey(var msg: TWMHotKey); message WM_HOTKEY;
...
public
{ Public declarations }
...
end;
procedure TForm1.WMHotKey(var msg: TWMHotKey);
begin
case msg.HotKey of
0: {响应Ctrl+Win+H的代码};
1: {响应Ctrl+Shift+S的代码};
end;
end;
其他具体内容参见WM_HOTKEY和上面两个API的帮助就行了!
解决java程序中
注册
系统
级
热键
把JIntellitype.dll复制到了C:\WINDOWS\system32下,然后在eclipse工程名在点击右键——属性——Java构建路径——库——添加外部jar。如果不行,放到D:\Program Files\Java\jre6\bin中,才有作用
java
注册
系统
级
热键
监听
在java中使用
系统
级
热键
监听,在java窗口失去焦点后仍能监听
热键
事件
jkeymaster:用于在 Java 中使用 JNA
注册
全局
热键
的库。 目标是支持基于 X11 的平台、Windows 和 MacOSX
JKeyMaster 这是一个 Java 库,它提供单一接口来为多个平台
注册
全局
热键
: 视窗基于 X11 的
系统
(理论上仅在一些 Linux 发行版和 PCBSD 上测试过) Mac OSX建造您将需要 Java 1.6+ 和 Maven 来构建 mvn clean ...
精易模块源码v7.6.5
9、新增“窗口_
注册
窗口
热键
”,
注册
窗口
级
热键
,只有在窗口被激活时才有效;。10、新增“窗口_撤销窗口
热键
”,撤销窗口
级
热键
;。二、修复。1、修复“时间_取北京时间”“时间_同步校时”多了八个小时,原因是...
易语言模块914个
DIY
热键
框模块.ec DLL注入模块.ec DOS命令模块.ec EC.EC EdbServer1.0客户端.ec EDB、高
级
表格、XLS互换.ec edb到html-1.0.ec EDB数据库客户端模块 1.0.ec edb数据库转Excel模块 1.0.ec edb数据库转Excel...
非技术区
829
社区成员
53,610
社区内容
发帖
与我相关
我的任务
非技术区
Delphi 非技术区
复制链接
扫一扫
分享
社区描述
Delphi 非技术区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章