zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    贫血,充血模型的解释以及一些经验(非常经典)(非原创)
    源代码管理安装大全
    20条常见的编码陷阱 你中枪了没?(转)
    从30岁到35岁:为你的生命多积累一些厚度(转)
    Model1 与Model2(转)
    白话MVP(转帖)
    stl string 使用
    TerminateThread不要使用的證據
    C++静态成员函数小结(转)
    C/C++必知必会1
  • 原文地址:https://www.cnblogs.com/dupengcheng/p/7658932.html
Copyright © 2011-2022 走看看