隐藏全局光标

时间:2014-06-09 14:56:56

标签: c++ winapi

我正在尝试为Google地球插件添加一些多点触控手势,因此我使用win32 API编写了一个小c ++后台程序来捕捉触觉驱动程序输入并使用模拟鼠标移动进行手势。

但是现在鼠标光标在屏幕上移动,所以我想在用户触摸屏幕时隐藏它(我已经使用BlockInput功能阻止了输入)。

有没有正确的方法呢?我看过来自GetCursorInfo的windows 8 CURSOR_SUPPRESSED响应,但无法触发...

编辑: 我发现了一种肮脏的方式,使用SetSystemCursor来隐藏你需要的每个游标:

SetSystemCursor(hCursor, OCR_SIZENS);

和SystemParametersInfo重置所有游标:

SystemParametersInfo(SPI_SETCURSORS, 0, NULL, 0);

我希望有更好的方法......

谢谢!

2 个答案:

答案 0 :(得分:0)

尝试ShowCursor

ShowCursor(FALSE);

答案 1 :(得分:0)

我最近在https://pandateemo.github.io/YoloMouse/的开发人员中遇到了这个问题,它会改变游戏中的光标。在不纠结目标进程或进入内核领域的情况下,我能找到的唯一可靠方法是使用setwindowshook hack,如下所示:

DWORD       process_id;
HMODULE     dll = LoadLibraryA("User32.dll");
HOOKPROC    cbt = (HOOKPROC)((uint64_t)GetProcAddress(dll, "ShowCursor"));
HWND        hwnd = (HWND)FindWindow( NULL, "World of Warcraft" );
DWORD       hwnd_thread_id = GetWindowThreadProcessId(hwnd, &process_id);
HHOOK       hproc = SetWindowsHookEx(WH_KEYBOARD, cbt, dll, hwnd_thread_id);

其被黑客入侵的原因是SetWindowsHookEx期望某些功能类似于

LRESULT CALLBACK KeyboardProc(
  _In_ int    code,
  _In_ WPARAM wParam,
  _In_ LPARAM lParam
);    

在目标进程中找到。而是您给它

int ShowCursor( BOOL bShow );

因此,当钩子触发时,它将 code “值传递给您提供的任何函数的第一个参数,在本例中为 ShowCursor 并且该值“始终”发生设为0(FALSE)。

继续尝试上面的某些游戏或应用,在本例中为魔兽世界。按任意键盘键,光标将消失:)

您可以为此使用其他挂钩。自动发送该挂钩希望触发的任何内容。在这种情况下, SendInput 可以模拟按键。您可以取消挂接,除非应用稍后内部调用 ShowCursor(true)