當我談到C++的時候,我很新手,所以對我一無所知。我正在嘗試創建一個小應用程序,該應用程序將檢測鼠標光標移動到屏幕邊緣並將其移動到相反的邊緣,以創建連續的桌面效果,如果這樣做合理的話。如何從Windows中的鼠標鉤子設置光標位置?
下面是我通過添加SetCursorPos將鼠標移動到固定位置的其他人的代碼(鼠標鉤子部分)。當我運行它時,SetCursorPos返回true,我認爲這意味着調用成功,但鼠標不移動。在稍後的Windows版本中,我在某處讀了一些關於安全限制的內容,以防止這樣的事情發生,這很有道理,但消息來源並不清楚這是多麼真實。有誰知道爲什麼這不起作用?
謝謝,下面的代碼:
#define _WIN32_WINNT 0x0400
#pragma comment(lib, "user32.lib")
#include <windows.h>
#include <stdio.h>
HHOOK hMouseHook;
__declspec(dllexport) LRESULT CALLBACK KeyboardEvent (int nCode, WPARAM wParam, LPARAM lParam)
{
MOUSEHOOKSTRUCT * pMouseStruct = (MOUSEHOOKSTRUCT *)lParam;
if (pMouseStruct != NULL)
{
if (pMouseStruct->pt.x < -1900)
{
BOOL r = SetCursorPos(
500,
500
);
printf("Trigger %d. Response %d", pMouseStruct->pt.x, r);
}
}
return CallNextHookEx(hMouseHook, nCode, wParam, lParam);
}
void MessageLoop()
{
MSG message;
while (GetMessage(&message,NULL,0,0)) {
TranslateMessage(&message);
DispatchMessage(&message);
}
}
DWORD WINAPI MyMouseLogger(LPVOID lpParm)
{
HINSTANCE hInstance = GetModuleHandle(NULL);
if (!hInstance) hInstance = LoadLibrary((LPCSTR) lpParm);
if (!hInstance) return 1;
hMouseHook = SetWindowsHookEx (
WH_MOUSE_LL,
(HOOKPROC) KeyboardEvent,
hInstance,
NULL
);
MessageLoop();
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;
}
你是否從你的printfs得到任何輸出? – drescherjm
你也可以嘗試一些比-1900更大的東西來測試。 – drescherjm
@drescherjm這是-1900,因爲那是我的左手顯示器左側20個左右的像素。我的printf吐出下面的「觸發-1917。響應1」等。我拿「響應1」表示呼叫沒有失敗,但鼠標不移動。這可能與單獨的線程有關嗎?如果我在程序的開始處(掛鉤之前)將SetCursorPos呼叫保持正確,則呼叫成功。 –