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

 
DKeN:

Você pode me dizer como pegar a janela chamada por F9 (Ordem)?

Não é possível encontrá-lo por texto.

Até o momento, foi pego da seguinte forma:

Isto não me parece ser um método nada confiável. Tente abrir alguma outra janela quando a janela de pedido estiver aberta, por exemplo, propriedades do gráfico, ou configurações de terminal, ou variáveis globais, etc. Que janela GetLastActivePopup lhe mostrará?
 

Olá!

Você pode me dizer como determinar o descritor de MT a partir de um EA em execução no testador?

A construção:

int hMetaTrader = GetAncestor(WindowHandle(Symbol(),Period()),2);              // Дескриптор основного окна терминала
não funciona, porque
WindowHandle(Symbol(),Period())

Retorna 0.

 

Um gráfico como este está aberto neste momento? (com o símbolo e o período especificados)

 
Meat:

Um gráfico como este está aberto neste momento? (com símbolo e período especificados)

Sim, é claro.

Experimentei de ambas as maneiras.

Ou é uma característica da função WindowHandle (embora não haja nenhuma palavra sobre ela em ajuda...)

Ou talvez eu seja idiota...

 
lasso:

Sim, é claro.

Experimentei de ambas as maneiras.

Ou é uma peculiaridade da função WindowHandle (embora a ajuda não mencione isso...).

Ou talvez eu seja idiota...

No modo de visualização, o cabo está funcionando sem qualquer problema. E você provavelmente não está testando em modo visual. Então faz sentido: sem janela, sem alça. Quanto às outras janelas abertas, pelo que entendi, elas não são acessíveis através do testador.
Nesse caso, a única saída é procurar uma janela Metatrader na lista de todas as janelas usando o FindWindowExA(...)
 
Meat:

Quando em modo de visualização, o cabo pode ser lido sem qualquer problema. Mas você deve estar testando NÃO em modo visual. Então faz sentido: sem janela, sem alça. Quanto às outras janelas abertas, entendo que elas não são acessíveis através do testador.
Nesse caso, a única saída é procurar a janela necessária na lista de todas as janelas usando FindWindowExA(...).

Sim, eu tentei aplicar o código Ilnur da página 5:


Ilnur:

Aqui está um exemplo de um roteiro que inicia um testador de estratégia e espera que ele seja concluído. O texto do botão é lido com GetWindowTextA().

Curiosamente, a janela de teste não tem necessariamente que ser visível neste caso.

Mas do testador, este truque não funcionou. (Estou lançando outro terminal para otimização do testador e quero acompanhar a conclusão deste processo).

Se não for muito difícil, você pode me dar um exemplo para FindWindowExA(...) ou um link?

 

Aqui eu tenho essa função para encontrar uma janela:

#import "user32.dll"
  int FindWindowExA(int hwndParent,int hwndChildAfter, string lpClassName, string lpWindowName);       
  int GetWindowThreadProcessId(int hWnd,int lpdwProcessId);
  int GetWindowTextA(int hWnd,string lpString,int nMaxCount);
#import

//инициализируем текстовый буффер длиной 128 байт. Вообще должен быть 255 байт! Но он не влезает на экран, из-за чего окно форума сильно растягивается :)
string textbuf="АбвгдежзийклмнопрстуфхцчшщъыьэюяАбвгдежзийклмнопрстуфхцчшщъыьэюяАбвгдежзийклмнопрстуфхцчшщъыьэюяАбвгдежзийклмнопрстуфхцчшщъыьэюя";

int FindWindow(string class, string caption, bool captionexactly=false)
{    
  //int CurrentThreadID=GetWindowThreadProcessId(WindowHandle(Symbol(),Period()),0);
  string null_string;
  int h=0;
  while(true)
  {    
    if (captionexactly)
      h=FindWindowExA(0,h,class,caption);
     else
      h=FindWindowExA(0,h,class,null_string);
    if (h==0) return(0);
    //if (GetWindowThreadProcessId(h,0)!=CurrentThreadID) continue;
    if (captionexactly) return(h);
    int len=StringLen(caption);
    if (GetWindowTextA(h,textbuf,128)<len) continue;
    if (StringSubstr(textbuf,0,len)==caption) return(h);  
  }
  return(0);
}
 

Procure o nome da classe e o título da janela necessária em SPY++.

Comentei a verificação da identificação do fio porque não é necessária neste caso (não há janela de fonte para comparar).

Em geral, aconselho-o a lidar com as funções WinAPI, se você for utilizá-las. Consulte a MSDN(http://msdn.microsoft.com/en-us/library/ff818516.aspx) para uma descrição detalhada das funções.

 
cm=GetDlgItem(hdlg,ID_SYMBOL);
int pos=SendMessageA(cm,CB_GETCOUNT,0,0);//get number in the list
// encontrar o par
string fs=";
for(int l=0;l<pos;l++){
int ll=SendMessageA(cm,CB_GETLBTEXT,l,fs);
Imprimir(ll," ",fs);
}

por favor, informe como obter corretamente uma lista de ferramentas na janela de pedido (F9)?

Eu recebo o número de elementos, mas não consigo obter exatamente as linhas por número, retorna -1.

#define ID_SYMBOL 0x053E // nome do personagem a selecionar

cmhandle ComboBox


 
Meat:

Aqui eu tenho essa função para a busca de janelas:


Alexey, obrigado, a função funciona, mas...
Carne:

Comentei a verificação da identificação do fluxo porque não é necessária neste caso (não temos uma janela de fonte para comparar).


Apenas a identificação do fio é necessária, pois tenho dois terminais envolvidos.

Saí dele através da identificação do cabeçalho, mas ainda gostaria de saber como determinar a identificação do fluxo sob o testador?