Как я могу имитировать нажатие кнопки, задав дескриптор окна кнопки?

Я хочу, чтобы имитировать щелчок по кнопке, расположенной в диалоговом окне.

У меня есть дескриптор этого окна. Это окно 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));
}