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

  • 相关阅读:
    解决listview在添加项闪烁的问题
    对于水晶报表,我欲哭无泪
    遗憾4年的.net学习和工作
    (转)字符编码笔记:ASCII,Unicode和UTF8
    关于将桌面扩展到监视器的问题 extended my windows desktop onto this monitor
    在win下mb_convert_encoding未定义的问题最终解决方案
    插入数据后, 获取该记录id的方法
    Failed to generate a user instance of SQL Server due to a failure in starting the process for the user instance. The connection will be closed.
    感冒怎么办,少听音乐防止感冒 生活至上,美容至尚!
    2招按摩轻松解除黑眼圈 生活至上,美容至尚!
  • 原文地址:https://www.cnblogs.com/dupengcheng/p/7658932.html
Copyright © 2011-2022 走看看