win32 获取 HotKey 控件中的内容(HKM_GETHOTKEY)

Posted DeaglePc

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了win32 获取 HotKey 控件中的内容(HKM_GETHOTKEY)相关的知识,希望对你有一定的参考价值。

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;
}
View Code

上面转换的代码来自http://blog.csdn.net/wwkaven/article/details/44119059

以上是关于win32 获取 HotKey 控件中的内容(HKM_GETHOTKEY)的主要内容,如果未能解决你的问题,请参考以下文章

Win32 选项卡控件中的右对齐选项卡项

获取 Win32 TreeView 控件的宽度

vc6.0如何使用getwindowtext函数获取edit控件中的文本内容

如何读取文本文件并将其显示在 win 32 unicode 字符集中的编辑控件上?

转 python通过win32api轻松获取控件的属性值

C#调用win32 api 操作其它窗口