11

マウスのクリックを監視する必要があるアプリケーションを書いています。

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

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

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

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

必要なものを実装する方法について誰かが考えていますか?

4

4 に答える 4

10

MSDNで説明されているように、マウス フックを設定する必要があります。

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

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

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

于 2012-05-30T14:12:06.143 に答える
5

あなたがあなたの問題を解決したかどうかはよくわかりません。そうだといい。しかし、今日も同じように困っていて、とても簡単にできる方法を見つけました。

だからここにいる:

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) です。ここで、ここに表示されるコードのいずれかを鍵とします

于 2015-04-19T04:46:01.570 に答える
4

あなたが使うことができます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;
}
于 2012-05-30T14:08:54.990 に答える
2

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

クリスがコメントで提案したように、画面上の任意の場所でマウスクリックを検出して処理したいので、1つの方法は、定義が非常に冗長である SetWindowsHookEx() を呼び出すことによってシステムに自分自身をフックすることです-それはあなたが追跡することを可能にしますシステムで起こっていることを調べ、その情報をアプリケーションに中継します。

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

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

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

重要:

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

仕事が少ないことが常に良い、または望ましいとは限りません。

于 2012-05-30T14:34:20.070 に答える