Для отправки сообщения BM_CLICK кнопке лучше использовать PostMessage, а не SendMessage. [1]
Главная причина заключается в том, что BM_CLICK заставляет кнопку визуально переключаться (анимировать нажатие) и генерировать событие WM_COMMAND с кодом BN_CLICKED для своего родительского окна. Если использовать SendMessage, ваша программа будет полностью заблокирована до тех пор, пока родительское окно чужого приложения не завершит всю цепочку обработки этого клика.
Сравнение PostMessage и SendMessage для BM_CLICK
PostMessage (Рекомендуется)
Принцип работы: Бросает сообщение в очередь и сразу возвращает управление.
Многопоточность: Безопасно. Не блокирует ваш поток, даже если цель зависла.
Поведение UI: Кнопка корректно и плавно отрисовывает анимацию клика.
Синхронизация: Выполняется асинхронно (в порядке очереди Windows).
SendMessage (Не рекомендуется)
Принцип работы: Вызывает оконную процедуру напрямую и ждет завершения.
Многопоточность: Риск deadlock (взаимной блокировки), если целевое окно не отвечает.
Поведение UI: Анимация может "залипнуть" или проскочить слишком быстро.
Синхронизация: Выполняется синхронно (немедленно).
Исключение из правил
Использовать SendMessage с BM_CLICK имеет смысл только в одном редком случае: если вашей программе строго необходимо дождаться, пока целевое приложение полностью отработает нажатие кнопки, прежде чем выполнять следующую строчку вашего кода. Однако даже в этом случае безопаснее использовать функцию SendMessageTimeout.
Пример правильного вызова (C++)
| Code: |
// Находим хэндл кнопки (например, кнопка "ОК")
HWND hButton = FindWindowEx(hParentWnd, NULL, L"Button", L"OK");
if (hButton != NULL) {
// Отправляем асинхронный клик — безопасно и надежно
PostMessage(hButton, BM_CLICK, 0, 0);
}
|