【问题标题】:Mouse lock horizontal / vertical movement鼠标锁定水平/垂直移动
【发布时间】:2014-08-23 18:57:52
【问题描述】:

我希望鼠标光标分别锁定在 X 或 Y 轴上的指定点上。我设法通过低级鼠标进程和键盘进程来实现这一点(需要键盘进程作为用户希望鼠标跟随的移动的输入 - 垂直或水平)。但是,我的问题是-在锁定运动时,例如用 F7 水平-当我按下鼠标按钮或使用鼠标滚轮时,锁定的运动由于某种奇怪的原因而被释放,我无法理解,我显然不想要除非用户这么说(即按 F6),否则它会被释放。这是您可以检查它并查看我正在谈论的问题的代码:

#define _WIN32_WINNT 0x0501

#include <iostream>
#include <windows.h>
using namespace std;

bool block = false;
POINT p;
HHOOK hHook,hHook2;
unsigned int status = 0;
LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    KBDLLHOOKSTRUCT key;
    memcpy(&key,(void*)lParam,sizeof(KBDLLHOOKSTRUCT));

    if( wParam == WM_KEYDOWN)
    {
        if(key.vkCode == VK_F7)
        {
             //Horizontal only
             if (GetCursorPos(&p)) status = 1;
        }
        else if(key.vkCode == VK_F8)
        {
             //Vertical only
             if (GetCursorPos(&p)) status = 2;
        }
        else if(key.vkCode == VK_F6)
        {
             //Normal
             status = 0;
        }
    }
    return CallNextHookEx(hHook, nCode, wParam, lParam);
}

LRESULT CALLBACK LowLevelMouseProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    MSLLHOOKSTRUCT key;
    memcpy(&key,(void*)lParam,sizeof(MSLLHOOKSTRUCT));

    if(wParam == WM_MOUSEMOVE)
    {
        if(status == 1)
        {
            SetCursorPos(key.pt.x,p.y);
        }
        else if(status == 2)
        {
            SetCursorPos(p.x,key.pt.y);
        }
        else
        {
            return CallNextHookEx(hHook2, nCode, wParam, lParam);
        }
    }
    else
    {
        return CallNextHookEx(hHook2, nCode, wParam, lParam);
    }
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
  cout<<"F7 to allow Horizontal moving ONLY"<<endl;
  cout<<"F8 to allow Vertical moving ONLY"<<endl;
  cout<<"F6 to move freely"<<endl;
  hHook = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, hInstance, 0);
  hHook2 = SetWindowsHookEx(WH_MOUSE_LL, LowLevelMouseProc, hInstance, 0);
  MSG msg;
  while(GetMessage(&msg, NULL, 0, 0))
  {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
  }
  return msg.wParam;
}

【问题讨论】:

  • 您好,提前感谢您的帮助!

标签: c++ windows winapi mouseevent hook


【解决方案1】:

您的应用程序中可能有一个低级挂钩,它需要的时间比我认为的 200 毫秒要长,或者您在调试器中设置了断点;这将导致 Windows 取消注册您的窗口挂钩。

【讨论】:

  • 以上代码是我的应用程序中包含的所有代码,所以除了提到的那些之外,我没有任何其他的钩子。我也不用断点运行它。最奇怪的部分是例如命令 SetCursorPos(key.pt.x,p.y);释放水平锁定时(通过鼠标单击或鼠标滚轮等)仍会执行。根据我对 winapi 的一点经验,我猜想钩子链中有些东西搞砸了,但我不确定是什么或为什么。 BTW,上面的代码是函数式的,有兴趣的可以编译运行看看手头的问题。
猜你喜欢
  • 2013-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多