当前位置:C++技术网 > 精选软件 > 两种方法来检测键盘与鼠标的组合

两种方法来检测键盘与鼠标的组合

更新时间:2016-01-07 21:37:38浏览次数:1+次

    在学习键盘消息处理的时候,我们知道了可以使用GetKeyState函数来获取指定的按键的状态。这样就和当前按键一起形成组合键,如Ctrl+A。
    组合键的奥秘就在于,每一个按键消息,只携带与这个按键自己有关的信息。所以,无法得知另外一个按键的状态。组合键就是两个按键同时按下,此时不管在哪个按键消息中处理,都不能同时知晓两个按键的状态。
    所以,系统就提供了一种方案,辅助实现组合键的检测。说白了,就是在处理一个按键消息的时候,可以让系统来检测另一个按键的状态,然后返回结果,这样就在一个按键消息处理中,既知道当前按键的状态,也知道另一个按键的状态,就达到了检测两个键同时的状态。
    所以,对于鼠标消息也是可以这样的。当鼠标消息产生时,我们就可以去检测某个键的状态,从而实现将鼠标键与键盘的键形成组合键。这个也是通过GetKeyState函数来完成检测。检测代码如下:
int iState = GetKeyState(VK_CONTROL);
if(iState<0)
{
    MessageBox(hwnd,_T("鼠标单击时按下了Ctrl键"),_T("C++技术网提示"),0);
}
else
{
    MessageBox(hwnd,_T("鼠标单击时未按下了Ctrl键"),_T("C++技术网提示"),0);
}

    不过,在鼠标消息的参数中,本身也会携带参数,来指示同时按下了键盘上的哪个按键。这个信息就在鼠标消息的wParam参数中。检测的代码如下:
if (wParam&MK_CONTROL)
{
    MessageBox(hwnd,_T("鼠标单击时按下了Ctrl键"),_T("C++技术网提示"),0);
}
else
{
    MessageBox(hwnd,_T("鼠标单击时未按下了Ctrl键"),_T("C++技术网提示"),0);
}

    因此我们就得到了两种实现方法,实现的效果如下:

鼠标单击和键盘按键形成组合键

【鼠标单击和键盘按键形成组合键】
    下面是完整的代码:
#include "windows.h"
#include <tchar.h>
TCHAR txt[100]=_T("C++技术网www.cjjjs.com");
// - 项目是Unicode字符集
LRESULT CALLBACK WinProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
    HDC hdc;
    PAINTSTRUCT ps;
    switch (message)
    {
        case WM_PAINT:
            hdc = BeginPaint(hwnd,&ps);
            TextOut(hdc,0,0,txt,lstrlen(txt));
            EndPaint(hwnd,&ps);
            return 0;
        case WM_LBUTTONDOWN:
            {
                //int iState = GetKeyState(VK_CONTROL);
                //if(iState<0)
                if (wParam&MK_CONTROL)
                {
                    MessageBox(hwnd,_T("鼠标单击时按下了Ctrl键"),_T("C++技术网提示"),0);
                }
                else
                {
                    MessageBox(hwnd,_T("鼠标单击时未按下了Ctrl键"),_T("C++技术网提示"),0);
                }
                return 0;
            }
        case WM_DESTROY:
            PostQuitMessage(0);
            return 0;
        default:
        break;//跳出到默认处理
    }
    return DefWindowProc(hwnd, message, wParam, lParam);
}

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrev,LPSTR lpCmd,int iShow)
{
    TCHAR ClassName[] = _T("MyClass");
    TCHAR title1[] = _T("C++技术网http://www.cjjjs.com");
    WNDCLASS wndClass;
    wndClass.cbClsExtra=0;
    wndClass.cbWndExtra=0;
    wndClass.hbrBackground= (HBRUSH)GetStockObject(WHITE_BRUSH);
    wndClass.hCursor=LoadCursor(NULL,IDC_HAND);
    wndClass.hIcon=LoadIcon(NULL,IDI_APPLICATION);
    wndClass.hInstance = hInstance;
    wndClass.lpfnWndProc = WinProc;
    wndClass.lpszClassName = ClassName;
    wndClass.lpszMenuName=NULL;
    wndClass.style=CS_HREDRAW|CS_VREDRAW;

    if(!RegisterClass(&wndClass))return 0;
    HWND hwnd = CreateWindow(ClassName,title1,WS_OVERLAPPEDWINDOW,0,0,650,400,NULL,NULL,hInstance,NULL);
    ShowWindow(hwnd,SW_SHOWNORMAL);

    MSG msg;
    while (GetMessage(&msg,NULL,0,0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.wParam;
}