如何在Windows中设置光标位置?

当谈到C ++时,我是相当的新手,对我来说是裸露的。 我试图创build一个小应用程序,它将检测当鼠标光标移动到屏幕的边缘,并将其移动到相反的边缘,创build一个连续的桌面效果,如果这是有道理的。

下面是一些其他人的代码(鼠标钩子部分),我通过添加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; } 

Solutions Collecting From Web of "如何在Windows中设置光标位置?"

这看起来是在你的钩子程序中调用SetCursorPos的问题。 我想这是明确禁止在Vista / Windows 7中,但我找不到任何文件来确认。 我稍微修改了你的代码,当它想要移动光标时发布一个线程消息,并在你的消息过程中执行实际的SetCursorPos。 一旦完成,它就可以正常工作。

在你的钩子程序中:

 if (pMouseStruct->pt.x < -1900) { PostThreadMessage( GetCurrentThreadId(), WM_USER, 0, 0 ); printf("Trigger %d. Response %d", pMouseStruct->pt.x, r); } 

在你的消息循环中:

 while (GetMessage(&message,NULL,0,0)) { if( message.hwnd == NULL ) { if( message.message == WM_USER ) { SetWindowPos( 500, 500 ); } } else { TranslateMessage( &message ); DispatchMessage( &message ); } } 

(注意这只是一个演示,而不是一个实际的修复。)

这就是说,你的代码有很多严重的问题。 我认为不适合在这里介绍所有这些内容,但我建议您在https://codereview.stackexchange.com/上发&#x5E03; 。

看起来你需要翻译坐标。 根据文档,您需要调用ClientToScreenScreenToClient来转换点。 我不知道哪个窗口是参考。 您需要将该窗口句柄作为参数(作为out参数)传递。 然后使用SetCursorPos修改的点

检查示例

如果你想要屏幕你需要做GetDC(NULL)并将返回的句柄传递给ClientToScreen