Проверить, нажата ли левая кнопка мыши?C ++ - PullRequest
0 голосов
/ 20 сентября 2019

Так что я только начинаю заниматься кодированием на C ++ и, немного освоившись, я начал программировать с помощью автоматического кликера.Я уже сделал это, чтобы вы могли переключать автоматический кликер, используя кнопку на клавиатуре или что-то в этом роде, но это не то, что я ищу.

Проблема, с которой я столкнулся, заключается в том, что я не могу найти способ проверить, нажата ли левая кнопка мыши.Если он удерживается, продолжайте нажимать, пока левая кнопка мыши больше не будет удерживаться.

Кроме того, я много осматривался, чтобы понять, как это сделать, и получил несколько разных вещей, которые я должен сделать, но ни одна из них не работает.Мне сказали использовать:

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

из этого ответа здесь , но я также обнаружил, что людям сказали использовать:

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 голосов
/ 21 сентября 2019

GetKeyState() принимает код виртуальной клавиши в качестве ввода, но 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;
   }
}
0 голосов
/ 20 сентября 2019

Я не уверен, правильно ли я понял q, но для проверки состояния нажатия вы всегда должны проверять младший бит в возвращенном старшем байте GetKeyState(VK_LBUTTON) (см. GetKeyState () в MSDN - означает:

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

WM_LBUTTONDOWN - это сообщение, которое отправляется в окно, сообщающее о событии нажатия левой кнопки мыши в клиентской области - такневерно использовать это в функции 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;
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...