Как убедиться, что postMessage был обработан другим приложением?

#winapi #visual-c #sendmessage #win32gui

#winapi #visual-c #sendmessage #win32gui

Вопрос:

Мое приложение 1 отправляет сообщения WM_LBUTTONDOWN и WM_LBUTTONUP в приложение 2 (стороннее), которое находится в другом процессе.

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

Вот псевдокод для app1

 PostMessage(app2Handle, WM_LBUTTON_DOWN, 0, lParam);
PostMessage(app2Handle, WM_LBUTTON_UP, 0, lParam);
// How to ensure above messages has been handled by app2 here?
  

Комментарии:

1. Попросите другое приложение уведомить вас, когда оно обработало сообщения. Почему вы все равно не используете автоматизацию?

2. Автоматизация пользовательского интерфейса не очень надежна для неактивного окна. т.Е. Для нажатия на элемент TreeView требуется, чтобы windows была активной. Вот почему я переключился на win32 API.

3. Это полная чушь. Автоматизация пользовательского интерфейса надежна, независимо от того, активно целевое окно или нет. В любом случае, воспроизведение ввода при чтении — это не то же самое, что его повторная обработка, и вы не можете имитировать ввод с клавиатуры с помощью postMessage , чтобы понять, почему это не может работать.

4. Хорошо, давайте сосредоточимся на вопросе. Кстати, я пробовал автоматизацию пользовательского интерфейса, у нее есть некоторые ограничения для некоторых операций, таких как щелчок по элементу TreeView, манипулирование DateTimePicker и т. Д… Я использовал белую библиотеку, даже для нажатия кнопки требуется, чтобы целевая widow находилась сверху. В любом случае, это разные вопросы.

5. Если у вас есть исходный код как App1, так и App2, альтернативной реализацией может быть регистрация пользовательского сообщения и определение простого протокола связи, например, App2 должен отправить подтверждение App1, когда обработка сообщения завершена, или ошибка или «невозможно обработать» код и т.д.

Ответ №1:

PostMessage() работает асинхронно. Он просто помещает сообщение в очередь сообщений целевого окна и затем немедленно завершает работу. При обработке сообщения уведомления нет. Если вам нужно это знать, вы можете попробовать использовать перехват сообщений из SetWindowsHookEx() для мониторинга активности очереди сообщений целевого окна и / или оконной процедуры. Или, может быть, вы могли бы использовать SetWinEventHook() для получения таких событий, как EVENT_OBJECT_INVOKED , EVENT_OBJECT_SELECTION... , и т.д., Если сообщения мыши предназначены для того, чтобы вызывать такие действия щелчка / выбора в окне.