2013-04-30 12 views
7

Voglio simulare un clic su un pulsante situato in una finestra di dialogo.Come posso simulare un clic del pulsante dato il manico alla finestra del pulsante?

Ho la maniglia per quella finestra. Questa è una finestra di tipo Abort/Retry/Ignore.

Non voglio simulare un clic con le coordinate X e Y poiché non soddisfa le mie esigenze.

+0

Questo potrebbe essere di aiuto? http://forums.codeguru.com/showthread.php?377394-Windows-SDK-User-Interface-How-can-I-emulate-mouse-events-in-an-application – Friedrich

+0

Non è normale. Sembra che l'affermazione fallisca da qualche parte e tu stia eseguendo la versione di debug. Prova _set_abort_behavior(). –

risposta

8

Trova la maniglia per il pulsante che si desidera fare clic su (utilizzando FindWindowEx), e basta inviare un messaggio clic:

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

Funziona ma non è una soluzione ellegante. WinAPI non supporta le funzioni che farebbero "clic" direttamente su uno dei pulsanti di Windows? E ho dovuto usare Spy ++ per ottenere il nome del Button che non era semplice. –

+0

@AronBoguta Puoi enumerare tutte le finestre usando 'EnumChildWindows', finché non trovi l'handle del pulsante di destinazione. Se WinAPI contenesse una funzione che "farebbe clic direttamente" sui pulsanti della finestra, farebbe esattamente la stessa cosa che abbiamo fatto. Inoltre, WinAPI tratta i pulsanti come finestre (secondarie). –

+0

grazie, so già che EnumChildWindows mi aspetterebbe ancora di più da WinAPI :) –

2

Prova questo per OK:

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

Non c'è un pulsante OK. Solo Annulla/Riprova/Ignora come ho detto e desidero fare clic su Interrompi –

4

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

In genere si può andare via senza lo hwndOfButton, se non lo si conosce - dipende dall'implementazione del dialogo!

Può essere SendMessage o PostMessage, a seconda del caso d'uso.

+0

Provato tutte le altre risposte. Questo è l'unico che ha funzionato per me. –

9

Invia un messaggio BM_CLICK alla HWND del pulsante:

SendMessage(hButton, BM_CLICK, 0, 0); 

che causa il pulsante per ricevere WM_LBUTTONDOWN e WM_LBUTTONUP messaggi, e il genitore di ricevere una BN_CLICKED di notifica, come se l'utente fosse fisicamente cliccato su il tasto.

1

Ecco una funzione completa:

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

Anche se questo non risponde alla domanda originale, mi ha aiutato per quello che stavo cercando, grazie! –

Problemi correlati