• 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

  • 相关阅读:
    yii之behaviors
    查看windows系统信息
    idm chrome扩展被阻止解决办法
    音乐乐理基础
    bootstrap4
    七牛上传整合CI
    提升上传速度
    卡漫绘图
    指针的操作
    定语从句八个易混淆
  • 原文地址:https://www.cnblogs.com/dupengcheng/p/7658932.html
Copyright © 2020-2023  润新知