gpt4 book ai didi

c++ - 如何在 Windows 中通过鼠标 Hook 设置光标位置?

转载 作者:可可西里 更新时间:2023-11-01 10:07:19 28 4
gpt4 key购买 nike

我正在尝试创建一个小应用程序,它将检测鼠标光标何时移动到屏幕边缘并将其移动到相反的边缘,以创建连续的桌面效果,如果这有意义的话。

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

最佳答案

这似乎是在您的 Hook 过程中调用 SetCursorPos 时出现的问题。我想这在 Vista/Windows 7 中是明确禁止的,但我找不到任何文档来证实这一点。我稍微修改了您的代码以在它想要移动光标时发布线程消息,并在您的消息过程中执行实际的 SetCursorPos。一旦完成,它就可以正常工作。

在你的钩子(Hook)程序中:

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/ 上.

关于c++ - 如何在 Windows 中通过鼠标 Hook 设置光标位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14439491/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com