第二节_系统热键
我们在使用G中,经常会先开G,然后开游戏,在进入游戏后按下某一个键,此时G界面就会显现出来,而且无论我们在干什么,只要我们按下那个键,界面就会出来,然后进行设置自动补血,打怪范围等等。被按下的那个键,就是热键,这就是本节要介绍的,系统热键及其使用
系统热键,通常是几个控制键的组合,或控制和字符键的组合,也可以是单独的某个键。当用户按下热键后,系统向预订的程序窗口发送预定的消息,该程序不论前台、后台都可以接受并处理该消息。例如QQ消息的提取就是一个典型的例子。
系统热键的使用必须要以先注册为前提,即先注册,再使用。注册热键的Windows API函数定义如下:
BOOL RegisterHorKey(HWND hWnd,int id,UNIT fsModifiers,UNIT vk);
参数hWnd为接受该热键消息的窗口句柄(下节介绍窗口及句柄)。参数id是在一个窗口可能注册多个热键的情况下用来区分不同热键消息的一个整数,取值范围是0x0000~0xBFFF(0x为十六进制的前缀)。第三个参数代表用户需要按下的几个控制键,取值如下:
MOD_ALT ALT键被按下
MOD_CONTROL CONTROL键被按下
MOD_SHIFT SHIFT被按下
MOD_WIN WIN键被按下
参数vk为热钱组合中使用的按键虚拟键码,可参看……(呃,晕4,摄像头有问题了,明了发图)
下面代码向系统注册了两个热键“CTRL+ALT+F3”和“CTRL+ALT+F4“:
RegisterHotKey(GetSafeHwnd(),1000,MOD_ALT|MOD_CONTROL,VK_F3);
RegisterHotKey(GetSafeHwnd(),1001,MOD_ALT|MOD_CONTROL,VK_F4);
注册之后,我们就要考虑接收问题。首先要在准备接受热键消息的窗口类中添加OnHotKey成员函数声明:
afx_msg LRESULT OnHotKey(WPARAM wParam,LPARAM lParam)
声明之后,就要添加消息映射,建立与窗口函数之间的连接:
BEGIN_MESSAGE_MAP(CHKDemo1View,CView)
ON_MESSAGE(WM_HOTKEY,OnHotKey)
END_MESSAGE_MAP()
然后就是处理,需要编写消息处理成员函数OnHotKey,其参数wParam就是注册热键消息时使用的ID,可以用来判断是哪一组热键。
下面的代码,是接收前面注册的两个热键消息:
#01. LRESULT CHKDemo1View::OnHotKey(WPARAM wParam,LPARAM lParam)
#02. {
#03. if(wParam==(UNIT)m_HKID1)
#04. AfxMessageBox("Hello ALT+CTRL+F3!");
#05. else if(wParam==(UNIT)m_HKID2)
#06. AfxMessageBox("Hello ALT+CTRL+F4!");
#07. return 1;
#08. }
前面介绍了热键的注册与热键消息的接收处理,貌似已经结束,但是我们要注意,当热键不再需要使用时,就应释放热键,可通过的下面API函数释放已注册的热键:
BOOL UnregisterHotKey(
HWND hWnd //热键相关窗口
int id //热键ID
)
下面的代码释放前面注册的两个热键:
UnregisterHotKey(GetSafeHwnd)(),m_HKID1);
UnregisterHotKey(GetSafeHwnd)(),m_HKID2);
好,到这里,基本上关于窗口类热键的各方面已经介绍完毕。本来这一节是准备介绍系统热键和窗口句柄两个内容的,但现在看来,内容有点偏多,就分开了。而且由于本人也是初学,不敢说多了,也说不了那么多,哪么快。还有这一节的一个实例,也由于时间原因,没有亲身实际编辑运行,本着对大家负责的态度,便没有放上来。在我实际运行,确定与预期结果没有偏差后,就会将实例发上来。另外,很抱歉,鉴于时间分配,再加上我也是初学,所以以后就两天一篇了,但我会尽量保证准时的。
最后给大家的一个建议,要是真正想学这方面的话,最好还是买几本相关的书,毕竟实体书有它的优势,那就是方便,随身,还不收地点限制,知识面也比较广、比较全,能随时翻阅。因为我在这空间不可能将书籍上的所有东西都搬上来,这样一是量大,二来也没什么大的意义了,只是把一些重点和自己的理解写在这儿,为了尽量能让更多朋友看得懂,再把涉及到的但不宜明白的东西的简明得连带解释一下。可以先买两本,一本关于C++语言学习的,一本关于WINDOWS编程的。希望我的这些文字能对大家有所帮助!