windows给我们提供了一个对话框控件HotKey非常好用,在设置热键的时候用起来很爽,但是一直百度就是没找到在win32下怎样通过消息获取这个控件里面的内容,找到的都是用MFC封装好的控件类来操作的,终于在MSDN找到了答案…
翻译过来就是要给控件发送这个消息 HKM_GETHOTKEY 头文件:Commctrl.h
// IDC_HOTKEY_SETTING 这个是热键控件的ID SendMessage(GetDlgItem(hDlg, IDC_HOTKEY_SETTING), HKM_GETHOTKEY, 0, 0);
返回值是得到的组合键值
Returns the virtual key code and modifier flags. The LOBYTE of the LOWORD is the virtual key code of the hot key. The HIBYTE of the LOWORD is the key modifier that specifies the keys that define a hot key combination. The modifier flags can be a combination of the following values.
翻译过来就是得到的数低16位有效,然后在这低16位中,低8位存的是虚拟键值(virtual key ),高8位是修饰键值(modifier)
virtual key 就是宏定义为VK_SPACE 等等这些,字母就是它的ASC码
modifier 看下面
Value Meaning
HOTKEYF_ALT ALT key
HOTKEYF_CONTROL CONTROL key
HOTKEYF_EXT Extended key
HOTKEYF_SHIFT SHIFT key
即这样使用
DWORD dwVal; dwVal = SendMessage(GetDlgItem(hDlg, IDC_HOTKEY_SETTING), HKM_GETHOTKEY, 0, 0); UINT uVk = LOBYTE(LOWORD(dwVal)); UINT uMod = HIBYTE(LOWORD(dwVal));
可以直接发送 HKM_SETHOTKEY 消息把得到的值传给 wParam 就可以设置控件框的内容了
如果要用得到的值注册热键,则需要进行转换,因为 HOTKEYF_ALT 和 RegisterHotKey 的参数 MOD_ALT 值是不一样的
#define MOD_ALT 0x0001 #define MOD_CONTROL 0x0002 #define MOD_SHIFT 0x0004 //------------------------------------- #define HOTKEYF_SHIFT 0x01 #define HOTKEYF_CONTROL 0x02 #define HOTKEYF_ALT 0x04
需要进行转换
UINT HotkeyToMod(UINT fsModifiers) { if ((fsModifiers & HOTKEYF_SHIFT) && !(fsModifiers & HOTKEYF_ALT)) // shift转alt { fsModifiers &= ~HOTKEYF_SHIFT; fsModifiers |= MOD_SHIFT; } else if (!(fsModifiers & HOTKEYF_SHIFT) && (fsModifiers & HOTKEYF_ALT)) // alt转shift { fsModifiers &= ~HOTKEYF_ALT; fsModifiers |= MOD_ALT; } return fsModifiers; } UINT ModToHotkey(UINT fsModifiers) { if ((fsModifiers & MOD_SHIFT) && !(fsModifiers & MOD_ALT)) // shift转alt { fsModifiers &= ~MOD_SHIFT; fsModifiers |= HOTKEYF_SHIFT; } else if (!(fsModifiers & MOD_SHIFT) && (fsModifiers & MOD_ALT)) // alt转shift { fsModifiers &= ~MOD_ALT; fsModifiers |= HOTKEYF_ALT; } return fsModifiers; } uMod = HotkeyToMod(uMod); if (!RegisterHotKey(g_hWnd, HOTKEY_SHOT, uMod, uVk)) { MessageBox(hDlg, L"注册热键失败,可能发生冲突", L"Error", MB_OK); break; }
上面转换的代码来自http://blog.csdn.net/wwkaven/article/details/44119059