zoukankan      html  css  js  c++  java
  • 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.lang.NoSuchMethodError:antlr.collections.AST.getLine() I
    T7 java Web day01 标签HTML
    T6 s1 day19
    T5 s5 Day18
    T5 s4 Day 17
    T5 s3 day16
    T5 s2 Day 15
    T5 s1 day14
    T4 S03 day 12
    T4 S01 day1
  • 原文地址:https://www.cnblogs.com/cheng07045406/p/3145983.html
Copyright © 2011-2022 走看看