发送鼠标左键后检测鼠标左键

时间:2017-05-02 20:58:40

标签: c++ windows

我正在编写一个程序,扫描是否按下鼠标左键,然后向上发送鼠标左键并在此之后继续。问题是,由于我发送鼠标左键,程序将无法继续,因为鼠标左键不再被按下。

这是一些伪:

if(GetKeyState(VK_LBUTTON) < 0){
   Sleep(10);
   mouse_event(MOUSEEVENTF_LEFTUP, p.x, p.y, 0, 0);
   //Rest of code
}

如何在此之后检测到鼠标左键是否已关闭?我必须使用驱动程序吗?

3 个答案:

答案 0 :(得分:1)

只需使用标志:

bool lButtonWasDown=flase;

if(GetKeyState(VK_LBUTTON) < 0){
   Sleep(10);
   lButtonWasDown = true;
   mouse_event(MOUSEEVENTF_LEFTUP, p.x, p.y, 0, 0);
} 

if (lButtonWasDown)
{
  // rest of the code for lButtonWasDown = true
}

答案 1 :(得分:0)

我还没有测试过这段代码,但它应该可以运行

while(programIsRunning)
{
   if(GetKeyState(VK_LBUTTON) < 0){
   Sleep(10);
   mouse_event(MOUSEEVENTF_LEFTUP, p.x, p.y, 0, 0);
   // rest of the code
}

它应该有效,因为如果在循环重新运行时保持Lmouse按钮,则会触发if语句,然后触发mouseup事件。

请注意: 您可以while(GetKeyState(VK_LBUTTON) < 0){//code here}

答案 2 :(得分:0)

从阅读你对程序的描述来看,这里只是我的实现。 使用Windows API:

while (true) {
     //check if left mouse button is down
     if (GetKeyState(VK_LBUTTON) & 0x8000) {
         //send left mouse button up
         //You might want to place a delay in here
         //to simulate the natural speed of a mouse click
         //Sleep(140);

         INPUT    Input = { 0 };
         ::ZeroMemory(&Input, sizeof(INPUT));
         Input.type = INPUT_MOUSE;
         Input.mi.dwFlags = MOUSEEVENTF_LEFTUP;
         ::SendInput(1, &Input, sizeof(INPUT));
     }
}

如果您想要在强行阻止人们点击和拖动时执行其他操作,您可以将此代码放入您在线程中调用的函数中。

void noHoldingAllowed() {
     //insert code here used above...
 }

 int main(void) {
  std::thread t1(noHoldingAllowed);
  //other stuff...

  return 0;
{