首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >鼠标锁定水平/垂直移动

鼠标锁定水平/垂直移动
EN

Stack Overflow用户
提问于 2014-08-24 02:57:52
回答 1查看 1.4K关注 0票数 2

我希望鼠标光标分别锁定在X或Y轴上的指定点。我设法使用低级鼠标proc和键盘proc (需要键盘proc作为用户希望鼠标跟随什么移动的输入-垂直还是水平)。然而,我的问题是锁定移动中的-while,比如用F7键水平移动--当我点击鼠标按钮或使用鼠标滚轮时,锁定的移动由于某种奇怪的原因被释放,我无法理解,我显然不希望它被释放,除非用户这么说(即按下F6)。下面是你可以查看的代码,看看我所说的问题:

代码语言:javascript
运行
复制
#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;
}
EN

回答 1

Stack Overflow用户

发布于 2014-08-24 05:43:03

你可能在你的应用程序中有一个低级钩子,耗时超过200ms,或者你在调试器中设置了一个断点;这会导致Windows注销你的窗口钩子。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25465382

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档