2013-04-30 3 views
7

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

У меня есть ручка к этому окну. Это окно Abort/Retry/Ignore.

Я не хочу идти с имитацией щелчка с координатами X и Y, так как он не подходит для моих нужд.

+0

Может ли это быть полезным? http://forums.codeguru.com/showthread.php?377394-Windows-SDK-User-Interface-How-can-I-emulate-mouse-events-in-an-application – Friedrich

+0

Это не нормально. Кажется, что утверждение терпит неудачу где-то, и вы используете отладочную версию. Попробуйте _set_abort_behavior(). –

ответ

8

Найти ручку на кнопке, которую вы хотите нажать (с помощью FindWindowEx), а просто отправить клик сообщение:

SendMessage(hButton, WM_LBUTTONDOWN, MK_LBUTTON, MAKELPARAM(0, 0)); 
SendMessage(hButton, WM_LBUTTONUP, MK_LBUTTON, MAKELPARAM(0, 0)); 
+0

Это работает, но это не элитарное решение. Не поддерживает ли WinAPI функции, которые непосредственно «нажимали» одну из кнопок Windows? И мне пришлось использовать Spy ++, чтобы получить название Button, которое не было прямым. –

+0

@AronBoguta Вы можете перечислить все окна, используя 'EnumChildWindows', пока не найдете маркер кнопки цели. Если WinAPI содержит функцию, которая будет непосредственно «нажимать» на кнопках окна, она будет делать то же самое, что и мы. Кроме того, WinAPI обрабатывает кнопки как (дочерние) окна. –

+0

спасибо, я уже знаю об EnumChildWindows, я бы ожидал большего от WinAPI :) –

2

Попробуйте это для ОК:

SendMessage(hWnd, WM_COMMAND, 1, NULL); 
+0

Нет кнопки OK. Только Abort/Retry/Ignore, как я сказал, и я хочу нажать Abort –

4

SendMessage(hParent, WM_COMMAND, MAKEWPARAM(IdOfButton, BN_CLICKED), (LPARAM)hwndOfButton);

Как правило, вы можете уйти без hwndOfButton, если вы этого не знаете - зависит от реализации диалога!

Это может быть SendMessage или PostMessage, в зависимости от вашего использования.

+0

Пробовал все остальные ответы. Это единственный, который работал на меня. –

9

Отправить BM_CLICK сообщение HWND кнопки:

SendMessage(hButton, BM_CLICK, 0, 0); 

Это вызывает кнопку, чтобы получить WM_LBUTTONDOWN и WM_LBUTTONUP сообщения, а также родителю получить BN_CLICKED уведомление, как если бы пользователь физически нажал на кнопка.

1

Вот полная функция:

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)); 
} 
+0

Даже если это не отвечает на исходный вопрос, это помогло мне в том, что я искал, спасибо! –

Смежные вопросы