Automação com interceptação por botão e clique do mouse. - página 7

 
HIDDEN >> :

Encontrei uma janela interessante. É quase impossível apanhar qualquer coisa dentro dele. A janela é chamada de "Salvar como". Você pode me dizer como pressionar o botão "Salvar"?

Se você selecionar o botão salvar especificamente, você tem o código do botão 00000001

Mas nada acontece quando o chamamos por este código. O que é esta janela sem nome?

Esta é uma caixa de diálogo popup. Seu descritor de sistema pode ser obtido usando a função WinAPI GetLastActivePopup(int hWnd).

Aqui está um exemplo de como usar esta função:

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

As caixas de seleção podem ser assinaladas programmaticamente se não estiverem presentes.

Quais funções Win API são usadas para fazer isso?

 

Encontrou uma função no WinAPI:


Função CheckDlgButton

Descrição:
função CheckDlgButton(Dlg: HWnd; IDButton: Integer; Verificação: Word);

Marca ou desmarca um controle de botão ou muda o estado de um controle de três botões.

Parâmetros:
Dlg: A caixa de diálogo que contém o botão.
IDButton: O controle modificável do botão.

Verificações: eliminado(0), marcado(1), sombreado(2).


Antes de executá-lo, qual a função de verificar o estado do botão. No meu caso, está na caixa de seleção.

 
Ilnur >> :



na continuação do tema API

ao salvar - se isso acontecer novamente, a questão surgirá!

exceto como

( arquivo existe substituir )


acertar YES automaticamente


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

Encontrou uma função no WinAPI:


Função CheckDlgButton

Descrição:
função CheckDlgButton(Dlg: HWnd; IDButton: Integer; Check: Word);

Rotula ou desmarca um controle de botão ou muda o estado de um controle com três botões.

Parâmetros:
Dlg: A caixa de diálogo que contém o botão.
IDButton: O controle modificável do botão.

Verificado: eliminado(0), marcado(1), sombreado(2).


Antes de executá-lo, qual a função a ser usada para verificar o estado do botão. No meu caso, na caixa de seleção.


Você pode usar a função IsDlgButtonChecked para determinar o estado atual do interruptor:

UINT WINAPI IsDlgButtonChecked(HWND hdlg, int idButton);

Esta função retorna o estado do interruptor com o botão idButton localizado na caixa de diálogo hdlg. Se o interruptor estiver em um estado desativado, um valor nulo é devolvido. Um valor de 1 é devolvido para uma chave que está ligada. Um valor de 2 corresponde a um interruptor inativo, mostrado em cinza. No caso de um erro, um valor negativo de -1 é devolvido.

---


Um exemplo de como o IsDlgButtonChecked funciona pode ser visto aqui

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

 

Decidiu voltar ao tema do estudo do WinAPI.

Estou tentando usar o Microsoft Spy++ v.9.00.21022 para encontrar o identificador da caixa de seleção "Otimização" a fim de verificar se ela está marcada ou não.

Eu faço o seguinte passo a passo.

1. Terminal iniciado.

2. Abriu a janela do testador.


3. Em Spy++ procurei uma janela e apontei para o elemento "Otimizar".


Clique no botão OK.

4. Passando pelas abas da próxima janela


Não consigo descobrir onde está meu código para este botão.


Ilnur ,YuraZ e outros me ensinam a identificar este código descritor que eu preciso.



Por que peço para ensiná-los, não para apontar especificamente para os códigos, porque quero aprender a identificar outros elementos. Embora se você especificar, talvez seja mais fácil para mim encontrá-los mais tarde, sabendo o que procurar e onde procurar....

 

Aqui eu dei um exemplo de código sobre como encontrar o identificador do botão "Start".

A mesma figura mostra como encontrar o identificador do controle.

Todos os controles localizados na janela do testador de estratégia são definidos da mesma forma.

Por exemplo, de acordo com a figura acima, o identificador da caixa de seleção "Otimização" (guia Geral) é 0x405.

 
Já tenho os códigos resolvidos. A única coisa que não consigo encontrar os códigos para os 2 botões é a data para testes e otimização de "Data" para "Data". O programa sai 00000001. Ilnur me diz os códigos destes botões.
 
HIDDEN >> :
Já resolvi o problema. A única coisa que não consigo encontrar códigos de 2 botões - data para teste e otimização de "Data" a "Data". Saídas do programa 00000001. Ilnur me diz os códigos destes botões.

Sim, de fato, os identificadores desses itens são os mesmos. Portanto, não podemos utilizar GetDlgItem() neste caso.

Isto deixa a opção de identificá-los usando o FindWindowExA(). No entanto, a principal questão é se precisamos identificá-los.

Não é possível gerenciar esses itens, ou seja, especificar o período de otimização ou teste, por meio do WinAPI em MQL.

Embora eu possa estar errado.

 
Ilnur >> :

Sim, de fato, os identificadores desses itens são os mesmos. Portanto, não podemos utilizar GetDlgItem() neste caso.

Isto deixa a opção de identificá-los usando o FindWindowExA(). No entanto, a principal questão é se precisamos identificá-los.

Falta a possibilidade de gerenciar esses itens, ou seja, de especificar o período de otimização ou teste, por meio do WinAPI em MQL.

Mas posso estar errado.



encontrar um item com ID - 0x0577 (clique no botão Change Expert)

e clique em NextWindow 3 vezes apenas para entrar no campo De data: depois tente NextWindow mais duas vezes e entraremos no campo Até data:

em ambos os casos basta preencher os campos de data

SetWindowTextA( hwndEditDATEbeg, sDateBeg);

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

..

No MSQL5 eu gostaria muito de ter uma ferramenta embutida para comunicação com o testador...