【发布时间】:2013-01-04 13:23:32
【问题描述】:
我正在尝试创建一个小应用程序,该应用程序将检测鼠标光标何时移动到屏幕边缘并将其移动到另一边缘,以创建连续的桌面效果,如果这有意义的话。
下面是其他人的一些代码(鼠标钩子部分),我通过添加 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 是否有任何输出?
-
另外,您可能想尝试比 -1900 更大的东西来进行测试。
-
@drescherjm 这是-1900,因为那是我左手显示器左侧大约 20 个像素。我的 printf 吐出以下“触发器 -1917。响应 1”等。我认为“响应 1”表示调用没有失败,但鼠标没有移动。这可能与单独的线程有关吗?如果我在程序开始时(挂钩之前)直接调用 SetCursorPos,则调用成功。
-
您的 KeyboardEvent 函数不是 100% 正确的。当 nCode
-
许多事情在异步执行时开始起作用。我会尝试将用户定义的消息从 KeyboardEvent 发布到主应用程序线程,并在那里执行 SetCursorPos。
标签: c++ windows winapi mouse-hook