213上位机VC MFC使用快捷键快速完成指定功能
213上位机VC MFC使用快捷键快速完成指定功能 功能展示 快捷键能够提高软件 的操作效率,比如QQ发送消息快捷键可以设置为Enter键或Ctrl+Enter键, 我们当前例程实现快捷键的使用功能,按Ctrl+Q, Ctrl+W, Ctrl+E三个快捷键可以快速调用不同对话框,效果如图; 要点提示 1一.快捷键的使用可以用函数RegisterHotKey()进行注册; 函数原型:BOOLRegisterHotKey(HWND hWnd,int id,UINT fsModifiers,UINT vk) 参数含义: 1.hWnd:接收热键产生WM_HOTKEY消息的窗口句柄。若该参数NULL,传递给调用线程的WM_HOTKEY消息必须在消息循环中进行处理。 2.id:定义热键的标识符。调用线程中的其他热键,不能使用同样的标识符。应用程序必须定义一个0X0000-0xBFFF范围的值。一个共享的动态链接库(DLL)必须定义一个范围为0xC000-0xFFFF的值(GlobalAddAtom函数返回该范围)。为了避免与其他动态链接库定义的热键冲突,一个DLL必须使用GlobalAddAtom函数获得热键的标识符。 3.fsModifoers:定义为了产生WM_HOTKEY消息而必须与由nVirtKey参数定义的键一起按下的键。该参数可以是如下值的组合: MOD_ALT 0x0001按下的可以是任一Alt键。 MOD_SHIFT 0x0004按下的可以是任一Shift键。 MOD_WIN 0x0008按下的可以是任一Windows徽标键。 MOD_NOREPEAT 0x4000更改热键行为,以便键盘自动重复不会产生多个热键通知。 MOD_CONTROL 0x0002按下的可以是任一Ctrl键。 4.vk:定义热键的虚拟键码。 数调用成功,返回一个非0值。若函数调用失败,则返回值为0。 可以调用GetLastError函数获取具体错误代码。 二.一旦热键设置成功,在程序应用过程中如果有相应的键被按下,Windows系统都会给你的应 用程序发送一个消息WM_HOTKEY,不管你的应用程序是否为当前活动的。 其中WM_HOTKEY消 息的格式为: idHotKey = (int) wParam; // 该参数在设置系统级的热键有用,一般不予使用 fuModifiers = (UINT) LOWORD(lParam); //热键的辅助按键 uVirtKey = (UINT) HIWORD(lParam); //热键的键值 三.在程序退出时再调用函数UnRegisterHotKey(handle, HotKeyId); 进行注销; 实现功能 1.新建基于对话框的应用程序 2.添加三个对话资源,关联对话框类,再将三个对话框类的头文件包含到主对话框中进行热键的测试用; 3.添加三个对话框变量及三个热键ID及热键消息处理函数private:ATOM m_HotkeyID0; ATOM m_HotkeyID1; ATOM m_HotkeyID2; void HotKey(WPARAMwParam,LPARAM lParam); CDlg1 m_Dlg1;CDlg1 m_Dlg2;CDlg1m_Dlg3; 并在主对话框初始化函数OnInitDialog()中初始化 - m_HotkeyID0 = GlobalAddAtom("MyHotKey0")-0XC000;
- m_HotkeyID1 = GlobalAddAtom("MyHotKey1")-0XC000;
- m_HotkeyID2 = GlobalAddAtom("MyHotKey2")-0XC000;
- if(!RegisterHotKey(this->m_hWnd,m_HotkeyID0,MOD_CONTROL,'A') )
- MessageBox("注册热键失败");
- if(!RegisterHotKey(this->m_hWnd,m_HotkeyID1,MOD_CONTROL,'S') )
- MessageBox("注册热键失败");
- if(!RegisterHotKey(this->m_hWnd,m_HotkeyID2,MOD_CONTROL,'D') )
- MessageBox("注册热键失败");
- m_Dlg1.Create(IDD_DIALOG1,this);
- m_Dlg2.Create(IDD_DIALOG2,this);
- m_Dlg3.Create(IDD_DIALOG3,this);
- 4.程序退出时注销热键
- void CGkbc8Dlg::OnDestroy()
- {
- CDialog::OnDestroy();
- ::UnregisterHotKey(this->m_hWnd,m_HotkeyID0);//注销热键
- ::UnregisterHotKey(this->m_hWnd,m_HotkeyID1);
- ::UnregisterHotKey(this->m_hWnd,m_HotkeyID2);
- }
复制代码- 5。热键的处理函数为void CGkbc8Dlg::HotKey(WPARAM wParam,LPARAM lParam)
- {
- if(m_HotkeyID0 == (int)wParam)
- {
- m_Dlg1.SetWindowPos(&wndTop,300,300,400,400,SWP_NOSIZE);
- m_Dlg1.ShowWindow(SW_SHOW);
- m_Dlg2.ShowWindow(SW_HIDE);
- m_Dlg3.ShowWindow(SW_HIDE);
- }
- if(m_HotkeyID1 == (int)wParam)
- {
- m_Dlg2.SetWindowPos(&wndTop,600,300,400,400,SWP_NOSIZE);
- m_Dlg2.ShowWindow(SW_SHOW);
- m_Dlg1.ShowWindow(SW_HIDE);
- m_Dlg3.ShowWindow(SW_HIDE);
- }
- if(m_HotkeyID2 == (int)wParam)
- {
- m_Dlg3.SetWindowPos(&wndTop,900,300,400,400,SWP_NOSIZE);
- m_Dlg3.ShowWindow(SW_SHOW);
- m_Dlg1.ShowWindow(SW_HIDE);
- m_Dlg2.ShowWindow(SW_HIDE);
- }
- }
复制代码记得将热键的处理函数与消息WM_HOTKEY进行映射关联,这样用户按下热键时我们的热键处理函数才会被调用 我们来演示下功能实现的整个过程
|