C#,MFC,Win32——实现系统级热键
站长推荐:NSetup一键部署软件
一键式完成美化安装包制作,自动增量升级,数据统计,数字签名。应对各种复杂场景,脚本模块化拆分,常规复杂的脚本代码,图形化设置。无需专业的研发经验,轻松完成项目部署。(www.nsetup.cn)
在这篇中先介绍如何设置系统级热键:
C#
第一步,先在类的级别中申明两个API函数,
private static extern bool RegisterHotKey(IntPtr hWnd, int id, uint fsModifiers, Keys vk);
“user32.dll“)]
private static extern bool UnregisterHotKey(IntPtr hWnd, int id);
[DllImport(
注意引入名字空间 System.Runtime.InteropServices;
上面两个函数参数的解释:
RegisterHotKey 函数中,
hWnd为本程序窗口的句柄,在C#的窗口中直接用Handle属性就可以引用窗口句柄
id为热键的标示符,是我们自己定义的,因为一个程序中可以定义多个热键,所以要用这个字段来区别,具体用法见下
fsModifiers为激活热键时,是否和系统键组合使用,none:0 Alt:1 Ctrl:2 Shift:4,并且还可以用或运算来组合使用
vk就是要定义的热键,C#中按键都被包含在Keys枚举中
UnregisterHotKey 函数中,
hWnd和RegisterHotKey 函数中是一样的,id为要卸载的热键标示
第二步,在窗口的初始化中注册热键,例如 RegisterHotKey(Handle, 100, 0, Keys.F9);
将些热键识别为100,0表示不使用系统键,Keys.F9表示此热键为F9,若要同时按Shift+Ctrl+F9,则第三个参数应该为 2|4 其实对二进制运算熟悉的朋友, 可以立刻算出 2|4=6
第三步,可以响应热键了:
重写窗体的WndProc函数,具体代码为
if (m.Msg == 0×312) {
if (m.WParam.ToInt32() == 100) {
DoSomething();
}
base.WndProc(ref m);
}
WndProc()函数的功能就是处理Windows消息,在其它地方还将看到这个函数的妙用!
第四步,在程序结束的时候调用UnregisterHotKey(Handle,100)卸载此热键!
WIN32
第一步,在int WINAPI WinMain()函数中,
while(GetMessage(&msg,NULL,0,0)){……}
之前,注册热键
RegisterHotKey(hWnd,100,0,VK_F9)
VK_F9为WinUser.h中定义的宏,其他键也是用类似的形式进行定义,不过数字键和字母键,直接用’0′,’A’这样的形式
第二步,在while(GetMessage(&msg,NULL,0,0)) {……}
循环体内,添加代码
{
}
第三步,在while()循环结束后,调用 UnregisterHotKey(hWnd,100) 卸载热键。
MFC
MFC程序分对话框模式和文档模式:
对话框模式:
第一步,在MFC的窗体中添加其WM_HOTKEY消息的响应,
{
if(nHotKeyId == 100)
{
DoSomething();
}
CDialog::OnHotKey(nHotKeyId, nKey1, nKey2);
}
第二步,在MFC窗体的初始化地方,添加注册热键的代码:
RegisterHotKey(m_hWnd,100,0,VK_F9);
注意上面的字段m_hWnd,是CWnd类中字段,完成由MFC控制,我们只需要在适合地方引用就可以了。
第三步,在窗体销毁的地方调用 UnregisterHotKey(hWnd,100) 卸载热键就可以了。
文档模式:
文档模式中和对话框模式中的情况大体相同,不同的是在CView派生类中响应WM_OnHotKey消息,在CView派生类对象的WM_CREATE消息中添加注册热键的代码,注意不能放在此对象的构造函数中,因为此时m_hWnd字段还未正确初始化。
到这里,大家可以已经掌握了在三种环境中设置系统级热键的方法。笔者的体会是,在WIN32和C#中方法大概相同,笔者就是在C#的基础上,尝试着在WIN32中实现该功能,结果一次成功,但是在MFC中就走了一些弯路。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 |
1,注册系统热键ALT+S和ALT+H (1)在ChatSvrDlg.h中添加 //注册的系统热键ALT+S和ALT+H用 //存储向操作系统添加的全局原子,是热键的标识符号 ATOM m_atomId_S,m_atomId_H; //标识热键是否注册成功。TRUE:成功; FALSE:失败 BOOL bRegisterHotKey_S,bRegisterHotKey_H; BOOL bSvrShow; (2)在ChatSvrDlg.h中添加 //定义热键消息 afx_msg void OnHotKey(WPARAM wParam,LPARAM lParam); (3)在ChatSvrDlg.cpp中 BEGIN_MESSAGE_MAP(CChatSvrDlg, CDialog) //{{AFX_MSG_MAP(CChatSvrDlg) … //添加热键消息映射定义 ON_MESSAGE(WM_HOTKEY,OnHotKey)// WM_HOTKEY为系统定义对消息 //系统热键ALT+S和ALT+H void CChatSvrDlg::OnHotKey(WPARAM wParam,LPARAM lParam) { //按下用户注册的ALT+S if (m_atomId_S==wParam) { //MessageBox("响应ALT+S热键消息"); bSvrShow=TRUE; OnPaint(); } //按下用户注册的ALT+H if (m_atomId_H==wParam) { //MessageBox("响应ALT+H热键消息"); bSvrShow=FALSE; OnPaint(); } } (4) 在ChatSvrDlg.cpp中 CChatSvrDlg::CChatSvrDlg(CWnd* pParent /*=NULL*/) : CDialog(CChatSvrDlg::IDD, pParent) { … //注册的系统热键ALT+S和ALT+H用 bRegisterHotKey_S=bRegisterHotKey_S=FALSE; bSvrShow=FALSE; } (5)在ChatSvrDlg.cpp中添加 BOOL CChatSvrDlg::OnInitDialog() { … //------------------------------------------- //注册新的系统热键Alt+S和Alt+h,控制Svr界面的显示和隐藏 //向操作系统添加一个全局原子ATOM m_atomId,作为该热键的符号名称 m_atomId_S=GlobalAddAtom("myHotKey_S"); m_atomId_H=GlobalAddAtom("myHotKey_H"); //设定ALT+S为热键 //注册成功将bRegisterHotKey_S变为TRUE,否则为FALSE if (!RegisterHotKey(m_hWnd,m_atomId_S,MOD_ALT,'S')) { bRegisterHotKey_S=FALSE; } else { bRegisterHotKey_S=TRUE; } //注册成功将bRegisterHotKey_H变为TRUE,否则为FALSE if (!RegisterHotKey(m_hWnd,m_atomId_H,MOD_ALT,'H')) { bRegisterHotKey_H=FALSE; } else { bRegisterHotKey_H=TRUE; } //------------------------------------------- … } (6)在void CChatSvrDlg::OnPaint()中,修改如下: //添加热键ALT+H和ALT+S if (bSvrShow) { //ATL+S使bSvrShow为TRUE ShowWindow(SW_SHOWNORMAL); } else { //ATL+H使bSvrShow为FALSE ShowWindow(SW_HIDE); } (7)在void CChatSvrDlg::OnCancel()中添加 //释放全局原子 GlobalDeleteAtom(m_atomId_S); GlobalDeleteAtom(m_atomId_H); (8)在BOOL CChatSvrDlg::WinOperation(LPTSTR lpCommand)中a_c命令中添加 //释放全局原子 GlobalDeleteAtom(m_atomId_S); GlobalDeleteAtom(m_atomId_H); |
学习日记,兼职软件设计,软件修改,毕业设计。
本文出自 学习日记,转载时请注明出处及相应链接。
本文永久链接: https://www.softwareace.cn/?p=1038