Automazione con intercettazione di pulsanti e clic del mouse. - pagina 7

 
HIDDEN >> :

Ho trovato una finestra interessante. È quasi impossibile prenderci qualcosa. La finestra si chiama "Salva con nome". Puoi dirmi come premere il pulsante "Salva"?

Se si seleziona specificamente il pulsante di salvataggio, si ha il codice del pulsante 00000001

Ma non succede niente quando lo si chiama con questo codice. Cos'è questa finestra senza nome?

Questa è una finestra di dialogo a comparsa. Il suo descrittore di sistema può essere ottenuto utilizzando la funzione WinAPI GetLastActivePopup(int hWnd).

Ecco un esempio di come usare questa funzione:

#include <WinUser32.mqh>

#import "user32.dll"
   int GetAncestor(int hWnd, int gaFlags);
   int GetDlgItem(int hDlg, int nIDDlgItem);
   int GetLastActivePopup(int hWnd);
#import

void start()
{
   int hMetaTrader, hDlg, hButtonSave, hChart = WindowHandle(Symbol(),Period());

   hMetaTrader = GetAncestor(hChart,2);          //дескриптор основного окна терминала
   PostMessageA(hMetaTrader,WM_COMMAND,57604,0); //вызываем окно сохранения
   Sleep(100);
   hDlg = GetLastActivePopup(hMetaTrader);       //получаем дескриптор всплывающего окна
   hButtonSave = GetDlgItem(hDlg,1);             //определяем дескриптор кнопки "Сохранить"
   PostMessageA(hDlg,WM_CO MMAND,1,hButtonSave);  //нажимаем на кнопку
}
 

Le caselle di controllo possono essere spuntate programmaticamente se non sono presenti.

Quali funzioni Win API sono usate per fare questo?

 

Trovata una funzione nella WinAPI:


Funzione CheckDlgButton

Descrizione:
funzione CheckDlgButton(Dlg: HWnd; IDButton: Integer; Check: Word);

Contrassegna o designa un controllo a pulsanti o cambia lo stato di un controllo a tre pulsanti.

Parametri:
Dlg: la finestra di dialogo che contiene il pulsante.
IDButton: il controllo modificabile del pulsante.

Controlli: cancellato(0), segnato(1), ombreggiato(2).


Prima di eseguirlo quale funzione per controllare lo stato del pulsante. Nel mio caso è nella casella di controllo.

 
Ilnur >> :



in continuazione del tema API

quando si salva - se questo accade di nuovo la domanda sorgerà!

salva come

( file esiste sostituire )


premere automaticamente SI


#include <WinUser32.mqh>

#import "user32.dll"
   int GetAncestor(int hWnd, int gaFlags);
   int GetDlgItem(int hDlg, int nIDDlgItem);
   int GetLastActivePopup(int hWnd);
#import

void start()
{
   int hMetaTrader, hDlg, hButtonSave, hChart = WindowHandle(Symbol(),Period());

   hMetaTrader = GetAncestor( hChart,2);          //дескриптор основного окна терминала
   PostMessageA( hMetaTrader, WM_COMMAND,57604,0); //вызываем окно сохранения
   Sleep(100);
   hDlg = GetLastActivePopup( hMetaTrader);       //получаем дескриптор всплывающего окна
   hButtonSave = GetDlgItem( hDlg,1);             //определяем дескриптор кнопки "Сохранить"

   PostMessageA( hDlg, WM_COMMAND,1, hButtonSave);  //нажимаем на кнопку ,
   Sleep(100);

// и тут может возникнуть еще один диалог ФАЙЛ СУЩЕСТВУЕТ  - сохранять ДА НЕТ
 
   int hDlg1 = GetLastActivePopup( hMetaTrader);      //  получаем дескриптор всплывающего окна СОХРАНЯТЬ ИЛИ НЕТ
   int hButtonYES = GetDlgItem( hDlg1,6);             //  определяем дескриптор кнопки  ДА  ID кнопки ДА он равен = 6
    PostMessageA( hDlg1, WM_COMMAND,6, hButtonYES);  // мы подтверждаем ДА


}
 
HIDDEN >> :

Trovata una funzione nella WinAPI:


Funzione CheckDlgButton

Descrizione:
funzione CheckDlgButton(Dlg: HWnd; IDButton: Integer; Check: Word);

Etichetta o deseleziona un controllo a pulsanti o cambia lo stato di un controllo a tre pulsanti.

Parametri:
Dlg: La finestra di dialogo che contiene il pulsante.
IDButton: il controllo modificabile del pulsante.

Controllato: cancellato(0), segnato(1), ombreggiato(2).


Prima di eseguirlo quale funzione usare per controllare lo stato del pulsante. Nel mio caso in checkbox.


Potete usare la funzione IsDlgButtonChecked per determinare lo stato attuale dell'interruttore:

UINT WINAPI IsDlgButtonChecked(HWND hdlg, int idButton);

Questa funzione restituisce lo stato dell'interruttore con idButton situato nella finestra di dialogo hdlg. Se l'interruttore è in uno stato disabilitato, viene restituito un valore nullo. Un valore di 1 viene restituito per un interruttore che è acceso. Un valore di 2 corrisponde a un interruttore inattivo, mostrato in grigio. In caso di errore, viene restituito un valore negativo di -1.

---


Un esempio di come funziona IsDlgButtonChecked può essere visto qui

http://frolov-lib.ru/books/bsp/v12/ch3_2.htm

 

Ho deciso di tornare al tema dello studio di WinAPI.

Sto cercando di usare Microsoft Spy++ v.9.00.21022 per trovare l'identificatore della casella di controllo "Ottimizzazione" per controllare se è spuntata o no.

Faccio il seguente passo per passo.

1. Terminale avviato.

2. ha aperto la finestra del tester.


3. In Spy++ ho cercato una finestra e ho indicato l'elemento "Optimize".


Ho cliccato sul pulsante OK.

4. Scorrere le schede della prossima finestra


Non riesco a capire dove sia il mio codice per questo pulsante.


Ilnur ,YuraZ e altri mi insegnano a identificare questo codice descrittore di cui ho bisogno.



Perché chiedo di insegnarvi, non di indicare specificamente i codici, perché voglio imparare a identificare altri elementi. Anche se se si specifica può essere più facile per me trovarli dopo, sapendo cosa cercare e dove cercare....

 

Qui ho dato un esempio di codice su come trovare l'identificatore del pulsante "Start".

La stessa figura mostra come trovare l'identificatore del controllo.

Tutti i controlli situati nella finestra del tester di strategia sono definiti allo stesso modo.

Per esempio, secondo l'immagine qui sopra, l'identificatore della casella di controllo "Ottimizzazione" (scheda Generale) è 0x405.

 
Ho risolto i codici. L'unica cosa che non riesco a trovare i codici per i 2 pulsanti è la data per i test e l'ottimizzazione da "Data" a "Data". Il programma produce 00000001. Ilnur mi dice i codici di questi pulsanti.
 
HIDDEN >> :
Ho risolto il problema. L'unica cosa che non riesco a trovare i codici di 2 pulsanti - data per i test e ottimizzazione da "Data" a "Data". Uscite del programma 00000001. Ilnur mi dice i codici di questi pulsanti.

Sì, infatti, gli identificatori di questi articoli sono gli stessi. Pertanto, non possiamo usare GetDlgItem() in questo caso.

Questo lascia la possibilità di identificarli usando FindWindowExA(). Tuttavia, la questione principale è se abbiamo bisogno di identificarli.

Non è possibile gestire questi elementi, cioè specificare il periodo di ottimizzazione o di test, per mezzo della WinAPI in MQL.

Anche se potrei sbagliarmi.

 
Ilnur >> :

Sì, infatti, gli identificatori di questi articoli sono gli stessi. Pertanto, non possiamo usare GetDlgItem() in questo caso.

Questo lascia la possibilità di identificarli usando FindWindowExA(). Tuttavia, la questione principale è se abbiamo bisogno di identificarli.

Manca la possibilità di gestire questi elementi, cioè di specificare l'ottimizzazione o il periodo di prova, per mezzo della WinAPI in MQL.

Potrei sbagliarmi, però.



trovare un elemento con ID - 0x0577 (cliccare sul pulsante Change Expert)

e clicchiamo su NextWindow 3 volte solo per entrare nel campo From date: poi proviamo NextWindow altre due volte e entreremo nel campo To date:

in entrambi i casi basta riempire i campi delle date

SetWindowTextA( hwndEditDATEbeg, sDateBeg);

SendMessageA(hwndEditDATEbeg, EN_UPDATE, _ID_EDIT_HEX_DATEbeg, 0);
SendMessageA(hwndEditDATEbeg, EN_CHANGE, _ID_EDIT_HEX_DATEbeg, 0);

..

In MSQL5 mi piacerebbe molto avere uno strumento integrato per la comunicazione con il tester...