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
, чтобы проверить это, и поведение такое же, поэтому я могу быть уверен, что в старой программе нет ничего странного, что вызывает это.
Большое спасибо, что читаете и помогаете!