MFC_全局热键注册和窗口热键注册

全局热键的注册

1.在初始化对话框的时候注册热键
RegisterHotKey(this->m_hWnd,2,MOD_CONTROL | MOD_SHIFT,'Q');

2.重写消息函数,OnHotKey
    
    if(nHotKeyId == 2){
        AfxMessageBox(_T("您按下的是shift+ctrl+q"));
    }else if(nHotKeyId == 3){
        AfxMessageBox(_T("您按下的是shift+win+q"));
    } 

    CDialog::OnHotKey(nHotKeyId, nKey1, nKey2);

3.重写消息函数,OnDestroy

    
    AfxMessageBox(_T("我被卸载了"));
    UnregisterHotKey(this->m_hWnd,2);
    UnregisterHotKey(this->m_hWnd,3);
    CDialog::OnDestroy();

 

 

 

 

 

下面是代码:

 

BOOL C键盘消息Dlg::OnInitDialog()
{
    CDialog::OnInitDialog();

    // 将“关于...”菜单项添加到系统菜单中。

    // IDM_ABOUTBOX 必须在系统命令范围内。
    ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
    ASSERT(IDM_ABOUTBOX < 0xF000);

    CMenu* pSysMenu = GetSystemMenu(FALSE);
    if (pSysMenu != NULL)
    {
        CString strAboutMenu;
        strAboutMenu.LoadString(IDS_ABOUTBOX);
        if (!strAboutMenu.IsEmpty())
        {
            pSysMenu->AppendMenu(MF_SEPARATOR);
            pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
        }
    }

    // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
    //  执行此操作
    SetIcon(m_hIcon, TRUE);            // 设置大图标
    SetIcon(m_hIcon, FALSE);        // 设置小图标

    // TODO: 在此添加额外的初始化代码

    /*
    
MOD_ALT
Either ALT key must be held down.
MOD_CONTROL
Either CTRL key must be held down.
MOD_SHIFT
Either SHIFT key must be held down.
MOD_WIN
Either WINDOWS key was held down. These keys are labeled with the Microsoft Windows logo. Keyboard shortcuts that involve the WINDOWS key are reserved for use by the operating system.

    */
    //句柄,消息ID,组合键,后面的Q都懂吧
    RegisterHotKey(this->m_hWnd,2,MOD_CONTROL | MOD_SHIFT,'Q');
    RegisterHotKey(this->m_hWnd,3,MOD_WIN | MOD_SHIFT,'Q');
    return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

void C键盘消息Dlg::OnSysCommand(UINT nID, LPARAM lParam)
{
    if ((nID & 0xFFF0) == IDM_ABOUTBOX)
    {
        CAboutDlg dlgAbout;
        dlgAbout.DoModal();
    }
    else
    {
        CDialog::OnSysCommand(nID, lParam);
    }
}

// 如果向对话框添加最小化按钮,则需要下面的代码
//  来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
//  这将由框架自动完成。

void C键盘消息Dlg::OnPaint()
{
    if (IsIconic())
    {
        CPaintDC dc(this); // 用于绘制的设备上下文

        SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

        // 使图标在工作区矩形中居中
        int cxIcon = GetSystemMetrics(SM_CXICON);
        int cyIcon = GetSystemMetrics(SM_CYICON);
        CRect rect;
        GetClientRect(&rect);
        int x = (rect.Width() - cxIcon + 1) / 2;
        int y = (rect.Height() - cyIcon + 1) / 2;

        // 绘制图标
        dc.DrawIcon(x, y, m_hIcon);
    }
    else
    {
        CDialog::OnPaint();
    }
}

//当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSOR C键盘消息Dlg::OnQueryDragIcon()
{
    return static_cast<HCURSOR>(m_hIcon);
}


void C键盘消息Dlg::OnLButtonDown(UINT nFlags, CPoint point)
{
    // TODO: 在此添加消息处理程序代码和/或调用默认值

    if((nFlags | MK_CONTROL) ==  nFlags ){
        AfxMessageBox(_T("我同时按下了contrl键"));
    }

    if((nFlags | MK_CONTROL | MK_SHIFT) ==  nFlags ){//进行或运算  010 | 010  = 010
        AfxMessageBox(_T("我同时按下了contrl+shift键"));
    }

    CString s;
    s.Format(_T("我是左键点击鼠标,我的x坐标是%d,我的y坐标是%d\r\n"),point.x,point.y);//这个坐标是相对于窗口的坐标,不算标题工具栏哦
    AfxMessageBox(s);


    CDialog::OnLButtonDown(nFlags, point);
}

BOOL C键盘消息Dlg::PreTranslateMessage(MSG* pMsg)
{
    if(pMsg->message == WM_KEYDOWN ){//键盘按下的事件
        //AfxMessageBox(_T("我按下了键盘的键"));
        switch(pMsg->wParam){
            case VK_NUMPAD9://这里面的消息都是大写,字母全是大写哦,如果要判断字母的 大小写就得到WM_CHAR消息里面去看
                //AfxMessageBox(_T("我按下了键盘的小键盘9"));        //msdn搜索:Virtual
                break;
            case 'G'://如果是G的话
                //如果按下的是G键的话,我们在判断Contrl键是否按下
                //GetKeyState(int nVirtKey)
/*
If the high-order bit is 1, the key is down; otherwise, it is up.
If the low-order bit is 1, the key is toggled. A key, such as the CAPS LOCK key, 
is toggled if it is turned on. 
The key is off and untoggled if the low-order bit is 0. 
A toggle key's indicator light (if any) on the keyboard will be on when the key is toggled, 
and off when the key is untoggled.
*/
//如果最高位为1的话,那么他就是按下了,如果不为1的话,那么就是没按下
//如果最低位为0的话,表示是大写状态,如果是小写的话,那么最低位就为1

                //GetKeyState获取最高位的状态,1位按下,0为没按下,1 左移15位,相当于把1移到第16位上,在进行判断是否为0
                BOOL IsPress = ((GetKeyState(VK_CONTROL)& (1<<(sizeof(SHORT)*8-1))) != 0);//取出来和进行&运算,2个为1才为1,否则为0,如果为0表示他没按下
                if(IsPress){
                    AfxMessageBox(_T("您按下的组合键,Contrl + G"));
                }
                //判断大写状态是否开启
                //判断大小写的话,就是取最低位,1位按下,0位没按下,!=0 说明是按下了,VK_CAPITAL  一定要写这个
                IsPress = ((GetKeyState(VK_CAPITAL) &1) != 0);//取出来和进行&运算,2个为1才为1,否则为0,如果为0表示他没按下

                if(IsPress){
                    AfxMessageBox(_T("您按下Contrl + G键的同时也按下了键盘大写键"));
                }
        }
    }else if(pMsg->message == WM_CHAR){//这个WM_CHAR消息只能接受a-z_0-9,可以输出到界面上的字符
        if(IsCharUpper(pMsg->wParam) == TRUE){//IsCharUpper如果是大写则返回TRUE
            
            //AfxMessageBox(_T("我是大写"));
        }else if(IsCharLower(pMsg->wParam) == TRUE){
        //AfxMessageBox(_T("我是小写"));
        }
        CString a;
        a.Format(_T("我是数字%d"),pMsg->wParam);
        //AfxMessageBox(a);
        char c = (char)pMsg->wParam;//把数字强制转换成char类型,也就是字母

        CString a1;
        a1.Format(_T("我是字母%c"),c);
        //AfxMessageBox(a1);
    }
    return CDialog::PreTranslateMessage(pMsg);
}

void C键盘消息Dlg::OnHotKey(UINT nHotKeyId, UINT nKey1, UINT nKey2)
{
    // TODO: 在此添加消息处理程序代码和/或调用默认值

    if(nHotKeyId == 2){//nHotKeyId是注册时候的ID
        AfxMessageBox(_T("您按下的是shift+ctrl+q"));
    }else if(nHotKeyId == 3){
        AfxMessageBox(_T("您按下的是shift+win+q"));
    } 

    CDialog::OnHotKey(nHotKeyId, nKey1, nKey2);
}

void C键盘消息Dlg::OnDestroy()
{

    AfxMessageBox(_T("我被卸载了"));
    UnregisterHotKey(this->m_hWnd,2);
    UnregisterHotKey(this->m_hWnd,3);//卸载,句柄,注册时候的ID
    CDialog::OnDestroy();

    // TODO: 在此处添加消息处理程序代码
}

 

 

 

 

 

 

 

 

 

posted @ 2013-08-06 19:11  宝贝,我永远都在  阅读(777)  评论(0)    收藏  举报