转载地址:http://my.oschina.net/871120/blog/288145
1. 热键的使用
热键不用了的话一定要卸载,否则下次启动时会被占用。
函数原型
注册函数
BOOL RegisterHotKey( HWND hWnd, // handle to window int id, // hot key identifier UINT fsModifiers, // key-modifier options UINT vk // virtual-key code );
hWnd------窗口句柄;
id------热键的标识;(如果是exe 这个标识的范围就在0-49151之间,如果是DLL 的话,就在49151-65535之间)
fsModifiers-------热键附加选项。(如要设定热键Alt+F5,则Alt在该参数中设置,F5在下面的参数vk中设置)该参数对应四个值:MOD_ALT(Alt键),MOD_CONTROL(Ctrl键),MOD_SHIFT(Shift键),MOD_WIN(Win键)。四个参数可自由组合,如:Alt+Ctrl,可设置为:MOD_ALT|MOD_CONTROL。
vk------虚拟键码。如:F5对应值为VK_F5,Home对应值为VK_HOME。
鼠标和键盘虚拟键码值如下:
Symbolic constant name | Value(hexadeclmal) | Mouse or keyboard equivalent |
VK_LBUTTON | 01 | Left mouse button |
VK_RBUTTON | 02 | Right mouse button |
VK_CANCEL | 03 | Control-break processing |
VK_MBUTTON | 04 | Middle mouse button (three-button mouse) |
VK_XBUTTON1 | 05 | Windows 2000: X1 mouse button |
VK_XBUTTON2 | 06 | Windows 2000: X2 mouse button |
VK_BACK | 8 | BACKSPACE key |
VK_TAB | 9 | TAB key |
VK_CLEAR | 0C | CLEAR key |
VK_RETURN | 0D | ENTER key |
VK_SHIFT | 10 | SHIFT key |
VK_CONTROL | 11 | CTRL key |
VK_MENU | 12 | ALT key |
VK_PAUSE | 13 | PAUSE key |
VK_CAPITAL | 14 | CAPS LOCK key |
VK_KANA | 15 | IME Kana mode |
VK_HANGUEL | 15 | IME Hanguel mode (maintained for compatibility; use VK_HANGUL) |
VK_HANGUL | 15 | IME Hangul mode |
— | 16 | Undefined |
VK_JUNJA | 17 | IME Junja mode |
VK_FINAL | 18 | IME final mode |
VK_HANJA | 19 | IME Hanja mode |
VK_KANJI | 19 | IME Kanji mode |
— | 1A | Undefined |
VK_ESCAPE | 1B | ESC key |
VK_CONVERT | 1C | IME convert |
VK_NONCONVERT | 1D | IME nonconvert |
VK_ACCEPT | 1E | IME accept |
VK_MODECHANGE | 1F | IME mode change request |
VK_SPACE | 20 | SPACEBAR |
VK_PRIOR | 21 | PAGE UP key |
VK_NEXT | 22 | PAGE DOWN key |
VK_END | 23 | END key |
VK_HOME | 24 | HOME key |
VK_LEFT | 25 | LEFT ARROW key |
VK_UP | 26 | UP ARROW key |
VK_RIGHT | 27 | RIGHT ARROW key |
VK_DOWN | 28 | DOWN ARROW key |
VK_SELECT | 29 | SELECT key |
VK_PRINT | 2A | PRINT key |
VK_EXECUTE | 2B | EXECUTE key |
VK_SNAPSHOT | 2C | PRINT SCREEN key |
VK_INSERT | 2D | INS key |
VK_DELETE | 2E | DEL key |
VK_HELP | 2F | HELP key |
VK_LWIN | 5B | Left Windows key (Microsoft Natural keyboard) |
VK_RWIN | 5C | Right Windows key (Natural keyboard) |
VK_APPS | 5D | Applications key (Natural keyboard) |
— | 5E | Reserved |
VK_SLEEP | 5F | Computer Sleep key |
VK_NUMPAD0 | 60 | Numeric keypad 0 key |
VK_NUMPAD1 | 61 | Numeric keypad 1 key |
VK_NUMPAD2 | 62 | Numeric keypad 2 key |
VK_NUMPAD3 | 63 | Numeric keypad 3 key |
VK_NUMPAD4 | 64 | Numeric keypad 4 key |
VK_NUMPAD5 | 65 | Numeric keypad 5 key |
VK_NUMPAD6 | 66 | Numeric keypad 6 key |
VK_NUMPAD7 | 67 | Numeric keypad 7 key |
VK_NUMPAD8 | 68 | Numeric keypad 8 key |
VK_NUMPAD9 | 69 | Numeric keypad 9 key |
VK_MULTIPLY | 6A | Multiply key |
VK_ADD | 6B | Add key |
VK_SEPARATOR | 6C | Separator key |
VK_SUBTRACT | 6D | Subtract key |
VK_DECIMAL | 6E | Decimal key |
VK_DIVIDE | 6F | Divide key |
VK_F1 | 70 | F1 key |
VK_F2 | 71 | F2 key |
VK_F3 | 72 | F3 key |
VK_F4 | 73 | F4 key |
VK_F5 | 74 | F5 key |
VK_F6 | 75 | F6 key |
VK_F7 | 76 | F7 key |
VK_F8 | 77 | F8 key |
VK_F9 | 78 | F9 key |
VK_F10 | 79 | F10 key |
VK_F11 | 7A | F11 key |
VK_F12 | 7B | F12 key |
VK_F13 | 7C | F13 key |
VK_F14 | 7D | F14 key |
VK_F15 | 7E | F15 key |
VK_F16 | 7F | F16 key |
VK_F17 | 80H | F17 key |
VK_F18 | 81H | F18 key |
VK_F19 | 82H | F19 key |
VK_F20 | 83H | F20 key |
VK_F21 | 84H | F21 key |
VK_F22 | 85H | F22 key |
VK_F23 | 86H | F23 key |
VK_F24 | 87H | F24 key |
— | 88–8F | Unassigned |
VK_NUMLOCK | 90 | NUM LOCK key |
VK_SCROLL | 91 | SCROLL LOCK key |
92–96 | OEM specific | |
— | 97–9F | Unassigned |
VK_LSHIFT | A0 | Left SHIFT key |
VK_RSHIFT | A1 | Right SHIFT key |
VK_LCONTROL | A2 | Left CONTROL key |
VK_RCONTROL | A3 | Right CONTROL key |
VK_LMENU | A4 | Left MENU key |
VK_RMENU | A5 | Right MENU key |
卸载函数
BOOL UnregisterHotKey( HWND hWnd, // handle to window int id // hot key identifier );
应用实例:
1. 新建MFC工程,创建一个对话框,并添加两个按钮,分别设置Caption为:RegisterHotKey和UnRegisterHotKey;
2. 双击[RegisterHotKey]按钮,添加回调函数;
void CMfcDialogDlg::OnBnClickedBntRegister() { //注册热键,设置热键为:Ctrl+Home RegisterHotKey(this->m_hWnd,100,MOD_CONTROL,VK_HOME); }
3.双击[UnRegisterHotKey] 按钮,添加回调函数;
void CMfcDialogDlg::OnBnClickedBntUnregister() { UnregisterHotKey(this->m_hWnd,100); //卸载热键 }
4.响应对话框WM_HOTKEY消息;
void CMfcDialogDlg::OnHotKey(UINT nHotKeyId, UINT nKey1, UINT nKey2) { AfxMessageBox("HotKey:Ctrl+Home"); CDialogEx::OnHotKey(nHotKeyId, nKey1, nKey2); }
5.运行程序,点击[RegisterHotKey]注册热键,然后按下热键:Ctrl+Home,即可弹出提示对话框。
6. 点击[UnRegisterHotKey]卸载热键。
2. 模拟键盘
Windows提供了一个模拟键盘的函数:Keybd_event,该函数产生一个键盘事件发送给当前获得输入焦点的程序。
注:该函数产生的键盘事件只对应用程序有效,不针对系统,如:模拟Ctrl+Alt+Del来调用任务管理器是无效的。
函数原型
VOID keybd_event( BYTE bVk, //虚拟键码,见上面“鼠标和键盘虚拟键码值表” BYTE bScan, // 硬件扫描码。一般不用 DWORD dwFlags, // 函数选项标识 ULONG_PTR dwExtraInfo //一般不用 );
dwFlag------ 代表键盘的两种状态“按下”和“弹起”。
应用实例
1. 在OnOk函数中添加函数。
void CMfcDialogDlg::OnBnClickedOk() { keybd_event(VK_LWIN,0,0,0); //按下Win键 keybd_event('F',0,0,0); //按下F键 keybd_event(VK_LWIN,0,2,0); //松开Win键 keybd_event('F',0,2,0); //松开F键 }2. 运行程序,点击[确定]按钮,运行结果如下,弹出“搜索”界面。
3. 模拟鼠标
通用Windows也提供了模拟鼠标函数:mouse_event。
函数原型
VOID mouse_event( DWORD dwFlags, // 鼠标的单击和移动选项 DWORD dx, // 横坐标 DWORD dy, // 纵坐标 DWORD dwData, // 齿轮的滚动 ULONG_PTR dwExtraInfo // 应用程序定义信息 );
dwFlags------ 选项标识。
鼠标单击和移动选项对应表
Value | Meaning |
MOUSEEVENTF_ABSOLUTE | 当指定这个值时,dx 和dy 将表示屏幕坐标点绝对坐标的映射。 |
MOUSEEVENTF_MOVE | 表示鼠标移动 |
MOUSEEVENTF_LEFTDOWN | 表示鼠标左键按下 |
MOUSEEVENTF_LEFTUP | 表示鼠标左键弹起 |
MOUSEEVENTF_RIGHTDOWN | 表示鼠标右键按下 |
MOUSEEVENTF_RIGHTUP | 表示鼠标右键弹起 |
MOUSEEVENTF_MIDDLEDOWN | 表示鼠标中间按键按下 |
MOUSEEVENTF_MIDDLEUP | 表示鼠标中间按键弹起 |
应用实例
1. 在OnOk函数中添加函数。
void CMfcDialogDlg::OnBnClickedOk() { SetCursorPos(44,752); //将鼠标移动到“开始”按钮上 mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP ,0,0,0,0); //模拟单击左键 }
2. 运行程序,点击[确定]按钮,运行结果如下,弹出“开始”界面。