2017-12-14 18 views
0

私の要件は次のとおりです。 マウスの左クリックイベントを検出して何らかの処置を行いたいと思います。マウスクリックが他のアプリケーション上で行われている場合には、特定のアプリケーションでのみマウスのクリックが検出されるはずです。アプリケーションのマウスクリックを検出し、関数を呼び出す

現在、私は使用しています:

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); 
} 

が、それはどこでもデスクトップ画面上のマウスクリックのために働いているし。私は現在のアプリケーションのためにそれを検出したいです。

+0

はここを見てすることがあります:[は、SetWindowsHookEx](https://msdn.microsoft.com/en-us/library/windows/desktop/ms644990( v = vs.85).aspx) - パラメータ 'dwThreadId'の説明 – Blacktempel

答えて

3

Win32アプリケーションがある場合。おそらくあなたはウィンドウの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; 
} 
+0

しかし、クリックが現在のウィンドウ/アプリケーションのみにあることをどのように確認するのですか? – Swapnil

+0

これで、グローバルマウスイベントフックではなく、Windowのマウスイベントをキャプチャするようになりました。試してみて、うまくいかない場合は教えてください。 Win32プログラミングの中心的な概念については、Charles Petzoldの本を読んでください。 – Anil8753

+0

私たちはこのコールバックをどこに登録するのですか? – Swapnil

関連する問題