web-dev-qa-db-ja.com

c ++:どこでマウスクリックが発生した場合でもキャッチする方法

私が書いているアプリケーションで、マウスクリックを監視する必要がある場所で立ち往生しています。

クリックは、アプリウィンドウ内ではなく、画面上のどこでも発生する可能性があり、クリックするたびにメッセージを渡す必要があります(アクションなどを実行します)。

私は周りを見回して、使用するようないくつかの提案を読みました

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

しかし、私は失敗しました。

誰かが私が必要なものを実装する方法についてのアイデアを持っていますか?

11
GSta

[〜#〜] msdn [〜#〜] の説明に従って、マウスフックを設定する必要があります。

あなたの場合、フックはグローバルである必要があることに注意してください。これは、DLLにハンドラー関数を実装する必要があることを意味します。これは、マウスメッセージを受信するシステム内のすべてのプロセスにロードされます。このようなDLLは、共有メモリなどのプロセス間通信(IPC)メカニズムを使用して、またはWindowsメッセージpostedを介してメインアプリケーションと通信します。 )(送信されません)DLLからメインアプリケーションへ。

このCodeProjectの記事 のソースコードをガイドとして使用できます。

更新:Chrisの訂正によると、上記は同期の「通常の」マウスフックに適用されることに注意してください。低レベルのフックはDLLに配置する必要はありませんが、 対応するMSDNの記事 で説明されている特定の制限があります。

あなたが問題を解決したかどうかはよくわかりません。そうだといい。しかし、今日も同じ問題を抱えていたので、検索すると本当に簡単な方法が見つかりました。

だからここにあります:

int keyPressed(int key){
    return (GetAsyncKeyState(key) & 0x8000 != 0);
}

int main(){
    while(1){
        if(keyPressed(VK_LBUTTON)){
            printf("%s\n","Click izquierdo");
        }
        if(keyPressed(VK_RBUTTON)){
            printf("%s\n","Click Derecho");
        }
    }
    return 0;
}

このソリューションのキーは関数GetAsyncKeyState(key)であり、ここに表示されるコードのいずれかにキーを設定します https://msdn.Microsoft.com/en-us/library/dd375731(VS.85).aspx

6
Enrique Wood

SetWindowsHookExを使用できます

これが小さなサンプルです:

#define _WIN32_WINNT 0x0500
#include <windows.h>

HHOOK MouseHook;

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

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


        if(wParam == WM_RBUTTONDOWN)
        { 
          // right button clicked 
          GetCursorPos(&p);
        }

}

void StayAlive(){
        while(_getch() != 27) { }
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
        LPSTR lpCmdLine, int nShowCmd){
        FreeConsole();

        MouseHook = SetWindowsHookEx(WH_MOUSE_LL,MouseHookProc,hInstance,0);
        StayAlive();

        UnhookWindowsHookEx(MouseHook);
        return 0;
}
4
Aurus

LRESULT CALLBACK WndProc(...)は、その名前が示すように、(特定の)ウィンドウ(メッセージ)プロセッサであり、システムによってコールバックのカスタム定義に延期されたキュー上のメッセージを分析して応答し、さらに処理することができます。

Chrisがコメントで示唆したように、画面上の任意の場所でマウスクリックを検出して操作したいので、1つの方法は、定義が非常に冗長なSetWindowsHookEx()を呼び出して、システムに接続することです。これにより、追跡が可能になります。システムで発生していることを処理し、その情報をアプリケーションに中継します。

これはあなたが自分自身を得るために採用する必要がある構文です

HHOOK WINAPI SetWindowsHookEx(
  __in  int idHook,
  __in  HOOKPROC lpfn,
  __in  HINSTANCE hMod,
  __in  DWORD dwThreadId
);

これは特定のフックIDを受け取ります。これは基本的に、システム全体から受信するメッセージの種類を関数に伝える小さな#defineであり、WndProcと同じようにコールバックを渡しますが、今回はシステム全体に関する着信メッセージ。 hModは、単にアプリケーションへのハンドル、または上記のproc関数コールバックが配置されているDLL)を参照します。最後のハンドルは、システムで現在実行されているスレッドに関連し、これを0またはに設定します。 NULLは、既存のすべてのスレッドのメッセージを取得します。

重要

SetWindowsHookExへのAurusの呼び出し例はプロセス固有であり、システム全体の複数のプロセスに追加できるDLLではなく、実際のアプリケーションに関連付けるファンシーワードであることに注意してください(グローバルなもの)そしてアプリケーションに情報を返します。実験にのみ役立つこの強力なアプローチの代わりに、ユージーンの推奨する方法を調査するために時間と労力を費やすのが賢明です。それは少し「難しい」ですが、報酬は価値があります。

少ない作業が常に良いまたは好ましいとは限りません。

2
user1309389