对于C ++来说,我是相当新手,所以对我来说很陌生。我正在尝试创建一个小应用程序,它将检测鼠标光标何时移动到屏幕边缘并将其移动到相对边缘,以创建连续的桌面效果,如果这是有道理的。
下面是来自其他人(鼠标钩子部分)的一些代码,我通过添加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;
}
答案 0 :(得分:3)
这似乎是在钩子操作中调用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/上。
答案 1 :(得分:0)
看起来你需要翻译坐标。
根据文档,您需要致电ClientToScreen
或ScreenToClient
来翻译这一点。我不知道哪个Window是参考。您需要将该窗口句柄作为参数传递为point(作为out参数)。然后使用SetCursorPos
检查example
如果您需要屏幕,您需要执行GetDC(NULL)
并将返回的句柄传递给ClientToScreen