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

时间:2019-09-20 13:50:46

标签: c++ winapi

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

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

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

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

从这个答案here,但我还发现人们被告知要使用:

if(GetKeyState(VK_LBUTTON) & 0x8000

可悲的是,我无法在历史记录中找到它。

  1. 我尝试获取 WM_LBUTTONDOWN 的键状态,但似乎没有发现按下的鼠标键。

  2. 我可以通过检查 VK_LBUTTON 的键状态来使它工作,但是那只会检查是否已按下鼠标左键,而不是按住。因此,它只是连续单击,直到您打破while循环或关闭程序。

  3. 真的不值得把它放下来,但是我12点钟就想着要检查一下是否已经按下了左键(就像之前的那个一样),它将布尔值设置为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;
   }

}

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

2 个答案:

答案 0 :(得分:0)

我不确定我是否正确理解q ..但是为了检查按下状态,您必须始终检查返回的GetKeyState(VK_LBUTTON)高字节的最低位(请参阅GetKeyState() in MSDN- -表示:

bool leftButtonPressed = 0 != (GetKeyState(VK_LBUTTON) & 0x800);

WM_LBUTTONDOWN是发送到窗口的消息,该消息报告了客户区中的Left-button-down事件-因此在GetKeyState()函数中使用该消息是错误的。尝试

const int delay = 50;
while (1) 
{
  if (GetKeyState(VK_LBUTTON) & 0x800)
  {
    Sleep(delay);
    mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0);
    mouse_event(MOUSEEVENTF_LEFTUP, 0,0, 0, 0);
    std::cout << "Clicked" << std::endl;
  }

  if (GetKeyState(VK_ESCAPE) & 0x800)
  {
    break;
  }
}

答案 1 :(得分:0)

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;
   }
}