5

マウスの座標をグローバルに出力するコードを手に入れました (WH_MOUSE_LL を使用)。私の目標は、WH_MOUSE_LL の代わりに WH_MOUSE を使用することです。WH_MOUSE を使用する場合、グローバルな効果を得るには DLL で宣言する必要があることをフォーラムで読みましたが、プログラムで使用すると、宣言されたアプリケーションで動作するはずですが、動作しません ( WH_MOUSE_LL を WH_MOUSE に変更すると、何も出力されません)。これはコードです:

#define _WIN32_WINNT 0x0400
#pragma comment( lib, "user32.lib" )

#include <windows.h>
#include <stdio.h>

HHOOK hMouseHook;

LRESULT CALLBACK mouseProc (int nCode, WPARAM wParam, LPARAM lParam)
{
    MOUSEHOOKSTRUCT * pMouseStruct = (MOUSEHOOKSTRUCT *)lParam;
    if (pMouseStruct != NULL){
        if(wParam == WM_LBUTTONDOWN)
        {
            printf( "clicked" ); 
        }
        printf("Mouse position X = %d  Mouse Position Y = %d\n", pMouseStruct->pt.x,pMouseStruct->pt.y);
    }
    return CallNextHookEx(hMouseHook, nCode, wParam, lParam);
}

DWORD WINAPI MyMouseLogger(LPVOID lpParm)
{
    HINSTANCE hInstance = GetModuleHandle(NULL);

    // here I put WH_MOUSE instead of WH_MOUSE_LL
    hMouseHook = SetWindowsHookEx( WH_MOUSE_LL, mouseProc, hInstance, NULL );

    MSG message;
    while (GetMessage(&message,NULL,0,0)) {
        TranslateMessage( &message );
        DispatchMessage( &message );
    }

    UnhookWindowsHookEx(hMouseHook);
    return 0;
}

int main(int argc, char** argv)
{
    HANDLE hThread;
    DWORD dwThread;

    hThread = CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)MyMouseLogger, (LPVOID) argv[0], NULL, &dwThread);
    if (hThread)
        return WaitForSingleObject(hThread,INFINITE);
    else
        return 1;

}
4

2 に答える 2

7
// here I put WH_MOUSE instead of WH_MOUSE_LL
hMouseHook = SetWindowsHookEx( WH_MOUSE_LL, mouseProc, hInstance, NULL );

ローカルにするには、4 番目のパラメーターも GetCurrentThreadId() に変更する必要があります。

于 2012-06-24T20:04:06.417 に答える
1

そこに「メイン」があるので、* _LLタイプ以外のメッセージで機能するには、それをdllにする必要があると思います

低レベルのマウスとキーボードのフックを理解する (win32)

http://developer-resource.blogspot.com/2008/07/setwindowshookex-example.htmlには dll の例があります

于 2013-09-10T20:01:48.610 に答える