• vc 热键、组合键的用法


    MFC c++ hotkey WM_HOTKEY  转网友:http://blog.csdn.net/hityct1/article/details/3853666

    【一】热键的使用

    主要使用RegisterHotKey和UnregisterHotKey两个API函数,具体介绍请看MSDN。这里以编辑框作为示例,先建一个CEdit的派生类 CMyEdit2。

    1)响应WM_HOTKEY消息

      RegisterHotKey可以向窗口发送WM_HOTKEY消息,所以先定义WM_HOTKEY消息映射。

      在.h文件中加入afx_msg LONG OnHotKey(WPARAM wParam,LPARAM lParam);  ,具体位置在:

    protected:
        //{{AFX_MSG(CMyEdit2)
        afx_msg void OnDestroy();
        afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
        //}}AFX_MSG
        afx_msg LONG OnHotKey(WPARAM wParam,LPARAM lParam);//手动加入
        DECLARE_MESSAGE_MAP()

    在.cpp文件中加入ON_MESSAGE(WM_HOTKEY,OnHotKey),具体位置在:

    BEGIN_MESSAGE_MAP(CMyEdit2, CEdit)
        //{{AFX_MSG_MAP(CMyEdit2)
        ON_WM_CHAR()
        ON_WM_DESTROY()
        ON_WM_CREATE()
        //}}AFX_MSG_MAP
        ON_MESSAGE(WM_HOTKEY,OnHotKey) //手动加入
    END_MESSAGE_MAP()

    定义响应函数:

    LONG CMyEdit2::OnHotKey(WPARAM wParam,LPARAM lParam)         
    {
    
        UINT fuModifiers = (UINT) LOWORD(lParam);  // key-modifier flags 
        UINT uVirtKey = (UINT) HIWORD(lParam);     // virtual-key code 
    
        //判断响应了什么热键
        if( MOD_CONTROL == fuModifiers && 'D' == uVirtKey )
        {
            AfxMessageBox(_T("你按下了组合键 ctrl + d"));  
        }
        else if( MOD_ALT == fuModifiers && 'M' == uVirtKey )
        {
            AfxMessageBox(_T("你按下了组合键 alt + m"));  
        }
        else
            AfxMessageBox(_T("你按下了未知热键"));  
                             
        return 0;        
    }

    2)登记热键

    void CMyEdit2::Init()
    {
    //此函数可以在PreSubclassWindow和OnCreate中使用;
    //如果不在前两者中使用,可以到放到CDialog::OnInitDialog或者
    //CView::OnInitialUpdate函数中使用
    
        ASSERT(NULL != GetSafeHwnd());
    
        //Register热键
    #ifdef _DEBUG //debug版本
        int nRet = RegisterHotKey(GetSafeHwnd(),m_nHotKeyID[0],MOD_CONTROL,'D'); //热键 ctrl + d
        if(!nRet)
            AfxMessageBox(_T("RegisterHotKey 0 false"));
        nRet = RegisterHotKey(GetSafeHwnd(),m_nHotKeyID[1],MOD_ALT,'M'); //热键 alt + m
        if(!nRet)
            AfxMessageBox(_T("RegisterHotKey 1 false"));
    #else //release版本
        RegisterHotKey(GetSafeHwnd(),m_nHotKeyID[0],MOD_CONTROL,'D'); //热键 ctrl + d
        RegisterHotKey(GetSafeHwnd(),m_nHotKeyID[1],MOD_ALT,'M'); //热键 alt + m
    #endif
    }

    3)Unregister热键

     

    void CMyEdit2::OnDestroy() 
    {
        CEdit::OnDestroy();
    
        //Unregister热键
    #ifdef _DEBUG    
        int nRet = UnregisterHotKey(GetSafeHwnd(), m_nHotKeyID[0]); 
        if(!nRet)
            AfxMessageBox(_T("UnregisterHotKey 0 false"));
        nRet = UnregisterHotKey(GetSafeHwnd(), m_nHotKeyID[1]); 
        if(!nRet)
            AfxMessageBox(_T("UnregisterHotKey 1 false"));
    #else
        UnregisterHotKey(GetSafeHwnd(), m_nHotKeyID[0]); 
        UnregisterHotKey(GetSafeHwnd(), m_nHotKeyID[1]); 
    #endif
    
    }

    附:Init()的使用位置,这里用变量IsInit(bool值)保证Init函数只被调用一次。

    void CMyEdit2::PreSubclassWindow() 
    {
        //初始化
        if( !IsInit )
        {
            Init();
            IsInit = true;
        }
        
        CEdit::PreSubclassWindow();
    }
    
    int CMyEdit2::OnCreate(LPCREATESTRUCT lpCreateStruct) 
    {
        if (CEdit::OnCreate(lpCreateStruct) == -1)
            return -1;
        
        //初始化
        if( !IsInit )
        {
            Init();
            IsInit = true;
        }
        
        return 0;
    }

    【二】(使用代码发送)发送组合键消息

    1)发送WM_HOTKEY消息

    WPARAM wParam;
        LPARAM lParam;
    
        //发送WM_HOTKEY消息,响应 ctrl + d 按键
        wParam = 0;
        lParam = MAKELONG(MOD_CONTROL,'D');
        ::SendMessage(hEditWnd,WM_HOTKEY, wParam, lParam);
  • 相关阅读:
    java多线程(待完善)
    eclipse console 查看全部的输出
    maven仓库地址
    拷贝Maven工程依赖的jar包出来
    ElasticSearch
    python2学习------基础语法5(常用容器以及相关操作)
    文本框焦点事件改变默认文字
    随机更换图片
    妙味——JS数组的方法
    妙味——封装getStyle()获取样式
  • 原文地址:https://www.cnblogs.com/cheng07045406/p/3145983.html
Copyright © 2020-2023  润新知