Automatisierung mit Abfangen von Tasten und Mausklicks. - Seite 7

 
HIDDEN >> :

Ich habe ein interessantes Fenster gefunden. Es ist fast unmöglich, darin etwas zu fangen. Das Fenster heißt "Speichern unter". Können Sie mir sagen, wie ich die Schaltfläche "Speichern" drücken kann?

Wenn Sie speziell die Schaltfläche "Speichern" auswählen, haben Sie den Schaltflächencode 00000001

Aber es passiert nichts, wenn man es mit diesem Code aufruft. Was ist dieses unbenannte Fenster?

Dies ist ein Popup-Dialogfeld. Sein Systemdeskriptor kann mit der WinAPI-Funktion GetLastActivePopup(int hWnd) ermittelt werden.

Hier ist ein Beispiel für die Verwendung dieser Funktion:

#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);  //нажимаем на кнопку
}
 

Die Kontrollkästchen können programmgesteuert angekreuzt werden, wenn sie nicht vorhanden sind.

Welche Win-API-Funktionen werden dafür verwendet?

 

Eine Funktion in der WinAPI gefunden:


Funktion CheckDlgButton

Beschreibung:
function CheckDlgButton(Dlg: HWnd; IDButton: Integer; Check: Word);

Markiert oder entmarkiert eine Tastensteuerung oder ändert den Zustand einer Drei-Tasten-Steuerung.

Parameter:
Dlg: Das Dialogfeld, das die Schaltfläche enthält.
IDButton: Das modifizierbare Steuerelement der Schaltfläche.

Prüfungen: gelöscht(0), markiert(1), schattiert(2).


Vor der Ausführung, welche Funktion, um den Zustand der Schaltfläche zu überprüfen. In meinem Fall steht es im Kontrollkästchen.

 
Ilnur >> :



in Fortführung des API-Themas

beim Speichern - wenn das noch einmal passiert, wird sich die Frage stellen!

speichern unter

( Datei existiert ersetzen )


automatisch YES drücken


#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 >> :

Eine Funktion in der WinAPI gefunden:


Funktion CheckDlgButton

Beschreibung:
function CheckDlgButton(Dlg: HWnd; IDButton: Integer; Check: Word);

Beschriftet oder deaktiviert eine Tastensteuerung oder ändert den Zustand einer Drei-Tasten-Steuerung.

Parameter:
Dlg: Das Dialogfeld, das die Schaltfläche enthält.
IDButton: Das modifizierbare Steuerelement der Schaltfläche.

Geprüft: gelöscht(0), markiert(1), schattiert(2).


Vor der Ausführung, welche Funktion verwendet werden soll, um den Zustand der Schaltfläche zu überprüfen. In meinem Fall im Kontrollkästchen.


Sie können die Funktion IsDlgButtonChecked verwenden, um den aktuellen Zustand des Schalters zu ermitteln:

UINT WINAPI IsDlgButtonChecked(HWND hdlg, int idButton);

Diese Funktion gibt den Zustand des Schalters mit idButton im hdlg-Dialogfeld zurück. Befindet sich der Schalter in einem deaktivierten Zustand, wird ein Nullwert zurückgegeben. Ein Wert von 1 wird zurückgegeben, wenn der Schalter eingeschaltet ist. Ein Wert von 2 entspricht einem inaktiven Schalter, der grau dargestellt ist. Im Falle eines Fehlers wird ein negativer Wert von -1 zurückgegeben.

---


Ein Beispiel dafür, wie IsDlgButtonChecked funktioniert, sehen Sie hier

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

 

Ich habe beschlossen, mich wieder mit dem Thema WinAPI zu beschäftigen.

Ich versuche, mit Microsoft Spy++ v.9.00.21022 die Kennung des Kontrollkästchens "Optimierung" zu finden, um zu prüfen, ob es aktiviert ist oder nicht.

Ich verfahre Schritt für Schritt wie folgt.

1. Gestartetes Terminal.

2. Öffnen Sie das Fenster des Testers.


3. In Spy++ habe ich nach einem Fenster gesucht und auf das Element "Optimize" gezeigt.


Klicken Sie auf die Schaltfläche OK.

4. Durchlaufen der Registerkarten des nächsten Fensters


Ich kann nicht herausfinden, wo mein Code für diese Schaltfläche ist.


Ilnur ,YuraZ und andere lehren mich, diesen Deskriptor-Code zu identifizieren, den ich brauche.



Warum bitte ich darum, Sie zu unterrichten, nicht speziell auf die Codes hinzuweisen, denn ich möchte lernen, andere Elemente zu erkennen. Obwohl, wenn Sie sie angeben, kann es für mich einfacher sein, sie später zu finden, da ich weiß, wonach ich suchen muss und wo ich suchen muss....

 

Hier habe ich ein Code-Beispiel dafür gegeben, wie man den Bezeichner der Schaltfläche "Start" findet.

Die gleiche Abbildung zeigt, wie man den Bezeichner des Steuerelements findet.

Alle Steuerelemente, die sich im Fenster des Strategietesters befinden, werden auf dieselbe Weise definiert.

In der obigen Abbildung lautet die Kennung des Kontrollkästchens "Optimierung" (Registerkarte "Allgemein") zum Beispiel 0x405.

 
Ich habe die Codes herausgefunden. Das einzige, was ich nicht finden kann, die Codes für die 2 Tasten ist das Datum für die Prüfung und Optimierung von "Datum" zu "Datum". Das Programm gibt 00000001 aus. Ilnur sagen Sie mir die Codes für diese Tasten.
 
HIDDEN >> :
Ich habe die Sache im Griff. Das einzige, was ich nicht finden können Codes von 2 Tasten - Datum für die Prüfung und Optimierung von "Datum" zu "Datum". Programmausgaben 00000001. Ilnur sagen Sie mir die Codes für diese Tasten.

Ja, in der Tat, die Kennungen dieser Artikel sind identisch. Daher können wir GetDlgItem() in diesem Fall nicht verwenden.

Damit bleibt die Möglichkeit, sie mit FindWindowExA() zu identifizieren. Die wichtigste Frage ist jedoch, ob wir sie identifizieren müssen.

Es ist nicht möglich, diese Elemente zu verwalten, d. h. den Optimierungs- oder Testzeitraum mit Hilfe der WinAPI in MQL festzulegen.

Ich kann mich aber auch irren.

 
Ilnur >> :

Ja, in der Tat, die Kennungen dieser Artikel sind identisch. Daher können wir GetDlgItem() in diesem Fall nicht verwenden.

Damit bleibt die Möglichkeit, sie mit FindWindowExA() zu identifizieren. Die wichtigste Frage ist jedoch, ob wir sie identifizieren müssen.

Es fehlt die Möglichkeit, diese Elemente zu verwalten, d.h. die Optimierung oder den Testzeitraum mit Hilfe der WinAPI in MQL anzugeben.

Ich kann mich aber auch irren.



Suchen Sie ein Element mit der ID 0x0577 (klicken Sie auf die Schaltfläche Experte ändern)

und klicken Sie dreimal auf NextWindow, um in das Feld From date zu gelangen: dann versuchen Sie NextWindow noch zweimal und wir gelangen in das Feld To date:

in beiden Fällen einfach Datumsfelder ausfüllen

SetWindowTextA( hwndEditDATEbeg, sDateBeg);

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

..

In MSQL5 würde ich wirklich gerne ein eingebautes Tool für die Kommunikation mit dem Tester haben...