Automatización con interceptación de botones y clics del ratón. - página 7

 
HIDDEN >> :

Encontré una ventana interesante. Es casi imposible atrapar algo en él. La ventana se llama "Guardar como". ¿Puede decirme cómo pulsar el botón "Guardar"?

Si selecciona específicamente el botón de guardar, tiene el código de botón 00000001

Pero no ocurre nada al llamarlo por este código. ¿Qué es esta ventana sin nombre?

Este es un cuadro de diálogo emergente. Su descriptor de sistema puede obtenerse mediante la función WinAPI GetLastActivePopup(int hWnd).

A continuación se muestra un ejemplo de cómo utilizar esta función:

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

Las casillas de verificación pueden marcarse mediante programación si no están presentes.

¿Qué funciones de la API de Win se utilizan para ello?

 

Se ha encontrado una función en la WinAPI:


Función CheckDlgButton

Descripción:
function CheckDlgButton(Dlg: HWnd; IDButton: Integer; Check: Word);

Marca o desmarca un control de botones o cambia el estado de un control de tres botones.

Parámetros:
Dlg: El cuadro de diálogo que contiene el botón.
IDButton: El control modificable del botón.

Comprobaciones: borrado(0), marcado(1), sombreado(2).


Antes de ejecutarlo qué función para comprobar el estado del botón. En mi caso está en la casilla de verificación.

 
Ilnur >> :



como continuación del tema de la API

al guardar - ¡si esto vuelve a ocurrir la pregunta se planteará!

guardar como

( el archivo existe reemplazar )


pulse el SÍ de forma automática


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

Se ha encontrado una función en la WinAPI:


Función CheckDlgButton

Descripción:
function CheckDlgButton(Dlg: HWnd; IDButton: Integer; Check: Word);

Etiqueta o desmarca un control de botones o cambia el estado de un control de tres botones.

Parámetros:
Dlg: El cuadro de diálogo que contiene el botón.
IDButton: El control modificable del botón.

Comprobado: borrado(0), marcado(1), sombreado(2).


Antes de ejecutarlo qué función utilizar para comprobar el estado del botón. En mi caso en casilla de verificación.


Puede utilizar la función IsDlgButtonChecked para determinar el estado actual del interruptor:

UINT WINAPI IsDlgButtonChecked(HWND hdlg, int idButton);

Esta función devuelve el estado del interruptor con idButton situado en el cuadro de diálogo hdlg. Si el interruptor está en estado desactivado, se devuelve un valor nulo. Se devuelve un valor de 1 para un interruptor que está encendido. Un valor de 2 corresponde a un interruptor inactivo, mostrado en gris. En caso de error, se devuelve un valor negativo de -1.

---


Un ejemplo de cómo funciona IsDlgButtonChecked puede verse aquí

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

 

Decidí volver al tema del estudio de WinAPI.

Estoy tratando de utilizar Microsoft Spy++ v.9.00.21022 para encontrar el identificador de la casilla de verificación "Optimización" con el fin de comprobar si está marcada o no.

Hago lo siguiente paso a paso.

1. Terminal iniciada.

2. abrir la ventana del probador.


3. En Spy++ busqué una ventana y señalé el elemento "Optimizar".


Haz clic en el botón OK.

4. Recorrer las pestañas de la siguiente ventana


No puedo averiguar dónde está mi código para este botón.


Ilnur ,YuraZ y otros me enseñan a identificar este código descriptor que necesito.



Por eso pido que te enseñen, no para señalar específicamente los códigos, porque quiero aprender a identificar otros elementos. Aunque si se especifica puede ser más fácil para mí encontrarlos después, sabiendo qué buscar y dónde buscar....

 

Aquí he dado un ejemplo de código sobre cómo encontrar el identificador del botón "Inicio".

La misma figura muestra cómo encontrar el identificador del control.

Todos los controles situados en la ventana del comprobador de estrategias se definen de la misma manera.

Por ejemplo, según la imagen anterior, el identificador de la casilla "Optimización" (pestaña General) es 0x405.

 
Ya tengo los códigos resueltos. Lo único que no encuentro los códigos de los 2 botones es la fecha de prueba y optimización de "Fecha" a "Fecha". El programa da como resultado 00000001. Ilnur dime los códigos de estos botones.
 
HIDDEN >> :
Lo tengo resuelto. Lo único que no encuentro son los códigos de 2 botones - fecha para probar y optimización de "Fecha" a "Fecha". Salidas del programa 00000001. Ilnur dime los códigos de estos botones.

Sí, efectivamente, los identificadores de estos artículos son los mismos. Por lo tanto, no podemos utilizar GetDlgItem() en este caso.

Esto deja la opción de identificarlos usando FindWindowExA(). Sin embargo, la cuestión principal es si debemos identificarlos.

No es posible gestionar estos elementos, es decir, especificar el periodo de optimización o de prueba, mediante la WinAPI en MQL.

Aunque puede que me equivoque.

 
Ilnur >> :

Sí, efectivamente, los identificadores de estos artículos son los mismos. Por lo tanto, no podemos utilizar GetDlgItem() en este caso.

Esto deja la opción de identificarlos usando FindWindowExA(). Sin embargo, la cuestión principal es si debemos identificarlos.

Se echa en falta la posibilidad de gestionar estos elementos, es decir, de especificar el periodo de optimización o de prueba, mediante la WinAPI en MQL.

Sin embargo, puedo estar equivocado.



encontrar un elemento con ID - 0x0577 (hacer clic en el botón Cambiar experto)

y haga clic en NextWindow 3 veces sólo para entrar en el campo de fecha From: luego intente NextWindow dos veces más y entraremos en el campo de fecha To:

en ambos casos sólo hay que rellenar los campos de fecha

SetWindowTextA( hwndEditDATEbeg, sDateBeg);

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

..

En MSQL5 me gustaría tener una herramienta integrada para la comunicación con el probador...

Razón de la queja: