Automatisation avec interception des boutons et des clics de souris. - page 7

 
HIDDEN >> :

J'ai trouvé une fenêtre intéressante. Il est presque impossible d'y attraper quoi que ce soit. La fenêtre s'appelle "Enregistrer sous". Pouvez-vous me dire comment appuyer sur le bouton "Enregistrer" ?

Si vous sélectionnez spécifiquement le bouton de sauvegarde, vous avez le code de bouton 00000001.

Mais rien ne se passe quand on l'appelle avec ce code. Quelle est cette fenêtre sans nom ?

Il s'agit d'une boîte de dialogue contextuelle. Son descripteur système peut être obtenu à l'aide de la fonction WinAPI GetLastActivePopup(int hWnd).

Voici un exemple d'utilisation de cette fonction :

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

Les cases à cocher peuvent être cochées de manière programmatique si elles ne sont pas présentes.

Quelles fonctions de l'API Win sont utilisées pour ce faire ?

 

J'ai trouvé une fonction dans l'interface WinAPI :


Fonction CheckDlgButton

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

Marquer ou démarquer une commande à boutons ou changer l'état d'une commande à trois boutons.

Paramètres :
Dlg : La boîte de dialogue qui contient le bouton.
IDButton : Le contrôle modifiable du bouton.

Contrôles : supprimé(0), marqué(1), ombré(2).


Avant de l'exécuter, quelle fonction pour vérifier l'état du bouton. Dans mon cas, c'est dans la case à cocher.

 
Ilnur >> :



dans la continuité du thème de l'API

lors de la sauvegarde - si cela se reproduit, la question se posera !

sauvegarder en tant que

( le fichier existe remplace )


cliquez automatiquement sur OUI


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

J'ai trouvé une fonction dans l'interface WinAPI :


Fonction CheckDlgButton

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

Étiquette ou désétiquette une commande à boutons ou change l'état d'une commande à trois boutons.

Paramètres :
Dlg : La boîte de dialogue qui contient le bouton.
IDButton : Le contrôle modifiable du bouton.

Vérifié : supprimé(0), marqué(1), ombré(2).


Avant de l'exécuter, quelle fonction utiliser pour vérifier l'état du bouton. Dans mon cas, dans la case à cocher.


Vous pouvez utiliser la fonction IsDlgButtonChecked pour déterminer l'état actuel de l'interrupteur :

UINT WINAPI IsDlgButtonChecked(HWND hdlg, int idButton) ;

Cette fonction renvoie l'état du commutateur avec idButton situé dans la boîte de dialogue hdlg. Si le commutateur est dans un état désactivé, une valeur nulle est renvoyée. Une valeur de 1 est renvoyée pour un interrupteur qui est activé. Une valeur de 2 correspond à un interrupteur inactif, représenté en gris. En cas d'erreur, une valeur négative de -1 est renvoyée.

---


Un exemple du fonctionnement de IsDlgButtonChecked peut être vu ici

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

 

J'ai décidé de revenir au sujet de l'étude de WinAPI.

J'essaie d'utiliser Microsoft Spy++ v.9.00.21022 pour trouver l'identifiant de la case à cocher "Optimisation" afin de vérifier si elle est cochée ou non.

Je procède comme suit, étape par étape.

1. Terminal démarré.

2. Ouvrez la fenêtre du testeur.


3. Dans Spy++, j'ai cherché une fenêtre et j'ai pointé l'élément "Optimiser".


Cliquez sur le bouton OK.

4. Parcourir les onglets de la fenêtre suivante


Je n'arrive pas à trouver où se trouve mon code pour ce bouton.


Ilnur ,YuraZ et d'autres m'apprennent à identifier ce code descripteur dont j'ai besoin.



Pourquoi je demande à vous enseigner, non pas pour pointer spécifiquement les codes, parce que je veux apprendre à identifier d'autres éléments. Mais si vous le précisez, il me sera plus facile de les trouver plus tard, en sachant ce qu'il faut chercher et où chercher.....

 

J'ai donnéici un exemple de code permettant de trouver l'identifiant du bouton "Start".

La même figure montre comment trouver l'identifiant du contrôle.

Tous les contrôles situés dans la fenêtre du testeur de stratégie sont définis de la même manière.

Par exemple, selon l'image ci-dessus, l'identifiant de la case à cocher "Optimisation" (onglet Général) est 0x405.

 
J'ai résolu les codes. La seule chose dont je n'arrive pas à trouver les codes pour les 2 boutons est la date de test et d'optimisation de "Date" à "Date". Le programme sort 00000001. Ilnur, dis-moi les codes de ces boutons.
 
HIDDEN >> :
J'ai tout réglé. La seule chose que je n'arrive pas à trouver, ce sont les codes de 2 boutons - date pour les tests et optimisation de "Date" à "Date". Sorties du programme 00000001. Ilnur, dis-moi les codes de ces boutons.

Oui, en effet, les identifiants de ces articles sont les mêmes. Par conséquent, nous ne pouvons pas utiliser GetDlgItem() dans ce cas.

Il reste donc la possibilité de les identifier en utilisant FindWindowExA(). Toutefois, la question principale est de savoir si nous devons les identifier.

Il n'est pas possible de gérer ces éléments, c'est-à-dire de spécifier la période d'optimisation ou de test, au moyen de l'interface WinAPI dans MQL.

Bien que je puisse me tromper.

 
Ilnur >> :

Oui, en effet, les identifiants de ces articles sont les mêmes. Par conséquent, nous ne pouvons pas utiliser GetDlgItem() dans ce cas.

Il reste donc la possibilité de les identifier en utilisant FindWindowExA(). Toutefois, la question principale est de savoir si nous devons les identifier.

La possibilité de gérer ces éléments, c'est-à-dire de spécifier la période d'optimisation ou de test, au moyen de l'interface WinAPI dans MQL, fait défaut.

Mais je peux me tromper.



trouvez un élément avec l'ID - 0x0577 (cliquez sur le bouton Modifier l'expert)

et cliquez 3 fois sur NextWindow pour entrer dans le champ de la date de départ : essayez ensuite deux fois de plus NextWindow et vous entrerez dans le champ de la date d'arrivée :

dans les deux cas, il suffit de remplir les champs de date

SetWindowTextA( hwndEditDATEbeg, sDateBeg) ;

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

..

Dans MSQL5, j'aimerais vraiment avoir un outil intégré pour la communication avec le testeur...

Raison: