如何实现系统级热键?
采用RegisterHotkey和截获WM_HOTKEY可以实现进程级热键,若我想实现类似windows文件查询(win + F)这种对整个系统都有效的热键,该如何实现,请高手指导!Thanks 问题点数:100、回复次数:6Top
1 楼Iamme(不死鸟)回复于 2002-11-06 09:00:05 得分 10
键盘钩子Top
2 楼slow_man(slow_man)回复于 2002-11-06 09:04:27 得分 0
鄙人对钩子简直一窍不通,请高手从理论到实现上给予知道!多谢了Top
3 楼szbug(深圳虫)回复于 2002-11-06 09:27:53 得分 10
理论上简单的说就是无论键盘按什么都通过你的钩子函数,那么你想怎么弄都随你拉。。。Top
4 楼jishiping(JSP 季世平)回复于 2002-11-06 10:08:15 得分 40
不明白你的意思?使用RegisterHotkey和截获WM_HOTKEY后,那么无论哪个程
序在最上面(激活),程序都可以响应用户按下的热键的。就说win+F,执行
的还是Windows自己的查找功能啊,不可能执行别的程序的功能吧。同样的道
理,你在你的程序中用RegisterHotkey定义了一个热键(就已经是系统热键
了),那么无论你的程序处于何种状态,程序都能收到这个热键的事件。
我想唯一的难点,是如何让你的程序的窗口跑到最上面吧。可以使用下面的
代码,让窗口句柄为Handle的窗口跑到最上面:
SetWindowPos(Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE);
SetWindowPos(Handle, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE|SWP_NOSIZE);
SetForegroundWindow(Handle);Top
5 楼slow_man(slow_man)回复于 2002-11-06 11:01:33 得分 0
楼上的兄弟:
其实是这样的,我做的系统共有5个EXE,他们之间通过FileMapping和消息来通信(他们的句柄都保存在了FileMapping中),但是我现在有个通用查询,在5个EXE中都有效,所以不论哪一个进程的窗口在最上面时(而且就算都不在最上面),都希望能够通过一个快捷键来实现通用查询。
顺便问一下:如果我在A进程注册了HotKey,在B进程能对该热键进行处理吗?Top
6 楼jishiping(JSP 季世平)回复于 2002-11-06 13:56:00 得分 40
"如果在A进程注册了HotKey,在B进程能对该热键进行处理吗?"
不可以的。你的5个EXE,你需要知道他们的先后次序。这很简单,拦截事件OnActivate,将FileMapping中保存的句柄重新排序就可以了。在任意一个
EXE中使用RegisterHotkey注册了热键后,从FileMapping中保存的句柄得到
最后一次激活的那个EXE的句柄,然后向这个窗口发送消息,让这个EXE执行
指定的代码。这样就实现你的功能了。注意,如果已经注册热键的EXE退出
后(在执行UnregisterHotKey之后),需要从剩下的EXE中挑选任意一个EXE
(给窗口发送消息),让这个EXE再次注册热键(就是始终有一个程序保持
热键被注册)。
Top




