Как согласовать Sendmessage, SendInput, Mouse_event, заблокированные Getasynckeystate?

TL;DR: мне нужно использовать как sendmessage, так и sendinput, чтобы попасть в старую функцию/событие в программе, которую я не могу перестроить. Находясь там, я не могу отпустить виртуальный щелчок мышью, используя любой из методов, которые я использовал, чтобы попасть туда в первую очередь - они игнорируются. Любой другой способ вызвать событие mousedown - тот, где я также мог бы отпустить щелчок мыши, может сработать.


Я пишу программу, которая должна взаимодействовать со старым программным обеспечением в черном ящике, написанным на VB6 давным-давно. Моя программа должна иметь возможность отправлять щелчки мыши, в частности, события mousedown и mouseup в старую программу.

Вот сложная часть... Событие mousedown в старой программе использует:

While GetAsyncKeyState(1)
Wend

ждать, пока пользователь отпустит мышь.

В настоящее время, чтобы вызвать событие, мне нужно использовать:

SendMessage(control_handle, WM_LBUTTONDOWN, 0, 0);

Input.type      = INPUT_MOUSE;
Input.mi.dwFlags  = MOUSEEVENTF_LEFTDOWN;
SendInput(1,&Input,sizeof(INPUT));

Это запускает событие (использование только sendmessage НЕ запускает необходимую ветвь внутри события, потому что эта ветвь также входит с тестом GetAsyncKeyState(1)), но выдача любой комбинации следующих действий НЕ освобождает щелчок мыши:

SendMessage(control_handle, WM_LBUTTONUP, 0, 0)
Input.type      = INPUT_MOUSE;
Input.mi.dwFlags  = MOUSEEVENTF_LEFTUP;
SendInput(1,&Input,sizeof(INPUT));

Код просто продолжает повторяться в части while/wend, он никогда не выходит. Код выпуска отправляется, но GetAsyncKeyState(1) не распознает его как выпуск мыши. СУПЕР странно, что GetAsyncKeyState(1) распознает функцию как событие нажатия мыши, а GetAsyncKeyState(1) не распознает как движение мыши вверх.

Что я тестировал:

  • Щелчок настоящей мышью в другом месте экрана активирует функцию.

  • Удаление вызова sendmessage и использование только функции sendinput (и ручное позиционирование мыши над объектом, который нужно щелкнуть) ДЕЙСТВИТЕЛЬНО работает для освобождения цикла.

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

  • Я также пробовал устаревшую функцию mouse_event, точно такое же поведение.

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

Я написал очень простую программу VB6 для моделирования цикла while/GetAsyncKeyState(1)/wend, чтобы проверить это, и поведение такое же, поэтому я могу быть уверен, что в старой программе нет ничего странного, что вызывает это.

Большое спасибо, что читаете и помогаете!


person Eric Scott    schedule 09.03.2018    source источник
comment
На случай, если это когда-нибудь случится с кем-то еще... Использование postmessage вместо sendmessage позволяет программе продолжать работу. Имеет смысл, правда...   -  person Eric Scott    schedule 10.03.2018
comment
Интересный вопрос. Если вы имеете в виду своим последним комментарием, что нашли решение, я бы сказал, что вы должны просто добавить это как реальный ответ ниже. Удачи!   -  person StayOnTarget    schedule 12.03.2018


Ответы (1)


На случай, если это когда-нибудь случится с кем-то еще... Использование postmessage вместо sendmessage позволяет программе продолжать работу. Имеет смысл, правда..

person Eric Scott    schedule 13.03.2018