2013-04-30 12 views
7

Chcę zasymulować kliknięcie przycisku znajdującego się w oknie dialogowym.Jak mogę zasymulować kliknięcie przycisku, biorąc pod uwagę uchwyt do okna przycisku?

Mam uchwyt do tego okna. Jest to okno typu Przerwij/Ponów/Ignoruj.

Nie chcę iść z symulowaniem kliknięcia o współrzędnych X i Y, ponieważ nie odpowiada moim potrzebom.

+0

Czy może to być pomocne? http://forums.codeguru.com/showthread.php?377394-Windows-SDK-User-Interface-How-może-mulować-moduł-wydarzenia-in-aplikacji – Friedrich

+0

To nie jest normalne. Wydaje się, że gdzieś dochodzi awaria, a ty uruchamiasz wersję debugowania. Wypróbuj _set_abort_behavior(). –

Odpowiedz

8

Znajdź uchwyt do przycisku, który chcesz kliknąć (przy użyciu FindWindowEx), i po prostu wysłać kliknij wiadomość:

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

Działa, ale nie jest to rozwikłane rozwiązanie. Czy funkcje wsparcia WinAPI nie będą bezpośrednio "klikać" jednego z przycisków okna? I musiałem użyć Spy ++, aby uzyskać nazwę Button, która nie była prosta. –

+0

@AronBoguta Możesz wyliczyć wszystkie okna za pomocą 'EnumChildWindows', dopóki nie znajdziesz docelowego przycisku przycisku. Jeśli WinAPI zawierał funkcję, która bezpośrednio kliknąłaby przyciski okna, zrobiłaby dokładnie to samo, co my. Ponadto WinAPI traktuje przyciski jako okna (podrzędne). –

+0

dziękuję, wiem już o EnumChildWindows jeszcze bym oczekiwał więcej od WinAPI :) –

2

Spróbuj na OK:

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

Nie ma przycisku OK. Tylko Przerwij/Ponów/Ignoruj ​​tak jak powiedziałem i chcę kliknąć Przerwij –

4

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

Zazwyczaj można uciec bez numeru hwndOfButton, jeśli go nie znasz - zależy to od implementacji okna dialogowego!

Może to być SendMessage lub PostMessage, w zależności od przypadku użycia.

+0

Wypróbowałem wszystkie pozostałe odpowiedzi. Ten jest jedyny, który pracował dla mnie. –

9

Wyślij wiadomość BM_CLICK do HWND przycisku:

SendMessage(hButton, BM_CLICK, 0, 0); 

który powoduje, że przycisk do odbierania WM_LBUTTONDOWN i WM_LBUTTONUP wiadomości, a także rodziców, aby otrzymać BN_CLICKED zawiadomienie, jakby użytkownik miał fizycznie kliknął przycisk.

1

Powyżej znajduje się pełna funkcja:

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

Mimo że to nie odpowiada na oryginalne pytanie, pomogło mi to, czego szukałem, dzięki! –

Powiązane problemy