c++ - 检查鼠标左键是否被按下?

标签 c++ winapi

因此,我只是开始使用C++进行编码,在学习了一点之后,我便开始编写自动答题器。我已经做到了,因此您可以使用键盘上的按钮或类似按钮切换自动答题器,但这不是我想要的。

我遇到的问题是我似乎无法找到一种方法来检查是否按住了鼠标左键。如果按住不放,请继续单击直到不再按住鼠标左键。

另外,我环顾四周以了解如何执行此操作,并且我得到了一些我应该做的不同事情,但是它们都不起作用。有人告诉我使用:

if((GetKeyState(VK_LBUTTON) & 0x100) != 0)

从这个答案here,但我还发现人们被告知要使用:
if(GetKeyState(VK_LBUTTON) & 0x8000

可悲的是,我找不到在历史上找到它的地方。
  • 我尝试获取 WM_LBUTTONDOWN 的键状态,但似乎没有按下鼠标键。
  • 我可以通过检查 VK_LBUTTON 的键状态来使其工作,但这仅是检查是否已按下鼠标左键,而不是按住。因此,它只是连续单击,直到您打破while循环或关闭程序。
  • 真的不值得把它放下来,但是我12点钟就想着要检查一下是否按下了左键(就像以前的那个一样),它将 bool(boolean) 值设置为true,然后继续单击。但是在那之后,我无法像以前一样停止它。现在回头看一下代码,我明白了为什么它不起作用。

  • while (1) {
       if(GetKeyState(WM_LBUTTONDOWN)) {
    
          Sleep(delay);
          mouse_event(MOUSEEVENTF_LEFTDOWN, x, y, 0, 0);
          mouse_event(MOUSEEVENTF_LEFTUP, x, y, 0, 0);
          std::cout << "Clicked" << endl;
       }
    
       if (GetKeyState(VK_ESCAPE)) {
    
          break;
       }
    
    }
    

    就像我之前说过的,我已经尝试了所有不同的组合来尝试使它起作用。但是我看不到鼠标左键是否被按下。我希望有人能提供答案,并能帮助我和其他人。无论如何,谢谢,祝你有美好的一天。

    最佳答案

    GetKeyState() virtual key code作为输入,但是 WM_LBUTTONDOWN 不是虚拟键码,它是一个窗口消息。请改用VK_LBUTTON

    另外,GetKeyState()依赖于调用线程本地的状态机。仅当线程处理其消息队列中的键盘/鼠标窗口消息时,才会更新该状态机。您的代码没有这样的消息处理。对于您要尝试的操作,请改为使用 GetAsyncKeyState()

    此外,不建议使用 mouse_event() ,并且已经使用了很长时间。请改用 SendInput()

    试试这个:

    while (GetAsyncKeyState(VK_ESCAPE) >= 0)
    {
       if (GetAsyncKeyState(VK_LBUTTON) < 0)
       {
          Sleep(delay);
    
          INPUT input[2] = {};
    
          input[0].type = INPUT_MOUSE;
          input[0].mi.dx = x;
          input[0].mi.dy = y;
          input[0].mi.dwFlags = MOUSEEVENTF_LEFTDOWN;
    
          input[1] = input[0];
          input[1].mi.dwFlags = MOUSEEVENTF_LEFTUP;
    
          SendInput(2, input, sizeof(INPUT));
    
          std::cout << "Clicked" << endl;
       }
    }
    

    关于c++ - 检查鼠标左键是否被按下?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58029712/

    相关文章:

    c++ - 服务 DLL 的 CPU 使用率?

    c++ - 在继承类中重载 << 和 >>

    c++ - Gtkmm TreeView : Accessing dynamically added columns

    c++ - 如何在 VB.net 中使用 Windows 电源管理 API

    visual-c++ - vtable 中重载方法的顺序(在 win32 上)

    c++ - 如何在 C++ 中为 LTEXT 控件调用 WM_CTLCOLORSTATIC 消息

    c++ - 如何编写传递可变大小的匿名 std::array 的推导指南?

    c++ - 字符串不返回主函数

    c++ - 使用 GDI+ 绘制文本

    c++ - wglCreateContextAttribsARB 在 NVIDIA 硬件上失败