Как я могу имитировать нажатие кнопки, задав дескриптор окна кнопки?
Я хочу, чтобы имитировать щелчок по кнопке, расположенной в диалоговом окне.
У меня есть дескриптор этого окна. Это окно Abort/Retry/Ignore.
Я не хочу идти с симуляцией щелчка с координатами X и Y, так как это не соответствует моим потребностям.
Ответы
Ответ 1
Найдите дескриптор кнопки, которую вы хотите щелкнуть (используя FindWindowEx
), и просто отправьте сообщение с кликом:
SendMessage(hButton, WM_LBUTTONDOWN, MK_LBUTTON, MAKELPARAM(0, 0));
SendMessage(hButton, WM_LBUTTONUP, MK_LBUTTON, MAKELPARAM(0, 0));
Ответ 2
Отправьте сообщение BM_CLICK
в HWND кнопки:
SendMessage(hButton, BM_CLICK, 0, 0);
Это заставляет кнопку получать сообщения WM_LBUTTONDOWN
и WM_LBUTTONUP
, а родительский - получать уведомление BN_CLICKED
, как если бы пользователь физически нажал на кнопку.
Ответ 3
SendMessage(hParent, WM_COMMAND, MAKEWPARAM(IdOfButton, BN_CLICKED), (LPARAM)hwndOfButton);
Как правило, вы можете обойтись без hwndOfButton
, если вы его не знаете - зависит от реализации диалога!
Это может быть SendMessage
или PostMessage
, в зависимости от вашего варианта использования.
Ответ 4
Попробуйте это для OK:
SendMessage(hWnd, WM_COMMAND, 1, NULL);
Ответ 5
Вот полная функция:
void clickControl(HWND hWnd, int x, int y)
{
POINT p;
p.x = x; p.y = y;
ClientToScreen(hWnd, &p);
SetCursorPos(p.x, p.y);
PostMessage(hWnd, WM_MOUSEMOVE, 0, MAKELPARAM(x, y));
PostMessage(hWnd, WM_LBUTTONDOWN, MK_LBUTTON, MAKELPARAM(x, y));
PostMessage(hWnd, WM_LBUTTONUP, MK_LBUTTON, MAKELPARAM(x, y));
}