0

グローバルなマウス位置を取得しようとしています。マウスの位置を取得できるフックが機能していますが、フックコード内でしかアクセスできません。main 内のデータにアクセスしようとしても機能しません。

これを説明する最良の方法は、コードを使用することです。

LRESULT CALLBACK mouseHookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
     PMSLLHOOKSTRUCT p = (PMSLLHOOKSTRUCT) lParam;
     position.x = p->pt.x;
     position.y = p->pt.y;
     std::cout<<position.x<<std::endl;
     return CallNextHookEx(NULL, nCode, wParam, lParam);
}

int WINAPI WinMain (HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpszArgument,int nCmdShow)
{
     HHOOK mouseHook = SetWindowsHookEx(WH_MOUSE_LL,mouseHookProc,hInstance,NULL);

     MessageBox(NULL, "Press OK to close.", "", MB_OK);
     return 0;
}

上記のコードでは、マウスを動かすと、コンソール ウィンドウに新しい位置が表示されます。ただし、main の中に入れるstd::cout<<position.x<<std::endl;と 0 とだけ表示され positionます。 はグローバル変数です。

出力がメインの内部にある場合のコード:

LRESULT CALLBACK mouseHookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
     PMSLLHOOKSTRUCT p = (PMSLLHOOKSTRUCT) lParam;
     position.x = p->pt.x;
     position.y = p->pt.y;

     return CallNextHookEx(NULL, nCode, wParam, lParam);
}

int WINAPI WinMain (HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpszArgument,int nCmdShow)
{
     HHOOK mouseHook = SetWindowsHookEx(WH_MOUSE_LL,mouseHookProc,hInstance,NULL);
     for(;;)
     {
         std::cout<<position.x<<std::endl;
     }
     MessageBox(NULL, "Press OK to close.", "", MB_OK);
     return 0;
}

コードの最初のチャンクは正常に動作し、マウスの位置を検出します。x、y データをメインに取得する方法がわかりません。

4

2 に答える 2

2

この投稿されたコードについて:

LRESULT CALLBACK mouseHookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
     PMSLLHOOKSTRUCT p = (PMSLLHOOKSTRUCT) lParam;
     position.x = p->pt.x;
     position.y = p->pt.y;

     return CallNextHookEx(NULL, nCode, wParam, lParam);
}

int WINAPI WinMain (HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpszArgument,int nCmdShow)
{
     HHOOK mouseHook = SetWindowsHookEx(WH_MOUSE_LL,mouseHookProc,hInstance,NULL);
     std::cout<<position.x<<std::endl;
     MessageBox(NULL, "Press OK to close.", "", MB_OK);
     return 0;
}

main 関数が指定する動作は次のとおりです。

  • まず、への呼び出しSetWindowsHookEx(これは 1 回発生します)。
  • 次に、出力position します (これは 1 回発生します)。
  • 次に、a を表示しますMessageBox (これは 1 回発生します)。

それで全部です。

フック プロシージャの呼び出し中MessageBox(マウスを動かすたびに) が呼び出されますが、目に見えることは何もなく、内部更新のみが行われます。

なぜもっと期待したのですか?


直し方:

  • MessageBox出力を行わないの内部メッセージ ループに依存する代わりに、独自のコードを作成します。
  • 機能性とは関係ありませんが、現在のコードが非常に汚れた服のようであり、その目的は果たしますが、着心地が悪いという理由だけで: Microsoft のWinMain怪物を標準の C および C++ に置き換えますmain
于 2013-04-12T10:23:32.497 に答える
1

グローバル フックの場合mouseHookProc、プロセスに挿入できるように、フック プロシージャは DLL 内にある必要があります。これを確認してください: http://www.codeproject.com/Articles/1037/Hooks-and-DLLs

于 2013-04-12T10:16:55.033 に答える