当我谈到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呼叫保持正确,则呼叫成功。 –