检测鼠标单击应用程序和调用功能

时间:2017-12-14 12:57:19

标签: c++ mouseclick-event

我的要求是: 我想检测鼠标左键单击事件并采取一些措施。如果鼠标单击在其他应用程序上,则应仅在给定的应用程序上检测到鼠标单击,然后它不应采取措施。

目前我正在使用:

mousehook = SetWindowsHookEx(WH_MOUSE_LL, MouseHookProc, NULL, 0);

LRESULT CALLBACK MouseHookProc(int nCode, WPARAM wParam, LPARAM lParam)
{

    PKBDLLHOOKSTRUCT k = (PKBDLLHOOKSTRUCT)(lParam);
    POINT p;

    if (wParam == WM_LBUTTONDOWN)
    {
        // MB1 click
    }
    return CallNextHookEx(0, nCode, wParam, lParam);
}

但它可以在桌面屏幕上的任何位置单击鼠标。我想仅针对当前应用检测它。

1 个答案:

答案 0 :(得分:3)

如果您有Win32应用程序。可能你可以在你的Window proc中处理鼠标事件。

     LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
     {
      switch (message)
      {
        case WM_LBUTTONDOWN:
          // your code
          return 0;

        case WM_LBUTTONUP:
          // your code
          return 0;

        case WM_DESTROY:
          PostQuitMessage(0);
          return 0;
      }
      return DefWindowProc(hwnd, message, wParam, lParam);
    }

创建窗口:

#include <windows.h>

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
    static TCHAR szAppName[] = TEXT("Connect");
    HWND hwnd;
    MSG msg;
    WNDCLASS wndclass;
    wndclass.style = CS_HREDRAW | CS_VREDRAW;
    wndclass.lpfnWndProc = WndProc;
    wndclass.cbClsExtra = 0;
    wndclass.cbWndExtra = 0;
    wndclass.hInstance = hInstance;
    wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
    wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    wndclass.lpszMenuName = NULL;
    wndclass.lpszClassName = szAppName;

    if (!RegisterClass(&wndclass)) {
        MessageBox(NULL, TEXT("Program requires Windows NT!"), szAppName, MB_ICONERROR);
        return 0;
    }

    hwnd = CreateWindow(szAppName, TEXT("Connect−the−Points Mouse Demo"),
        WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, CW_USEDEFAULT,
        CW_USEDEFAULT, CW_USEDEFAULT,
        NULL, NULL, hInstance, NULL);

    ShowWindow(hwnd, iCmdShow);
    UpdateWindow(hwnd);

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