Automazione con intercettazione di pulsanti e clic del mouse. - pagina 10

 
DKeN:

Potete dirmi come catturare la finestra chiamata da F9 (Ordine)?

Non riesco a trovarlo per testo.

Finora è stato catturato come segue:

Questo non mi sembra affatto un metodo affidabile. Provate ad aprire qualche altra finestra quando la finestra dell'ordine è aperta, per esempio proprietà del grafico, o impostazioni del terminale, o variabili globali, ecc. Quale finestra vi mostrerà GetLastActivePopup?
 

Ciao!

Potete dirmi come determinare il descrittore MT da un EA in esecuzione nel tester?

Il costrutto:

int hMetaTrader = GetAncestor(WindowHandle(Symbol(),Period()),2);              // Дескриптор основного окна терминала
non funziona, perché
WindowHandle(Symbol(),Period())

Restituisce 0.

 

Un grafico come questo è aperto a questo punto? (con il simbolo e il periodo specificati)

 
Meat:

Un grafico come questo è aperto a questo punto? (con il simbolo e il periodo specificati)

Sì, certo.

Provato in entrambi i modi.

O è una caratteristica della funzione WindowHandle (anche se non c'è una parola in aiuto...)

O forse sono stupido...

 
lasso:

Sì, certo.

Provato in entrambi i modi.

Oppure è una peculiarità della funzione WindowHandle (anche se l'aiuto non ne parla...).

O forse sono stupido...

In modalità di visualizzazione, la maniglia funziona senza problemi. E probabilmente state testando NON in modalità visiva. Allora ha senso: niente finestra, niente maniglia. Per quanto riguarda le altre finestre aperte, da quanto ho capito, non sono accessibili dal tester.
In questo caso, l'unica via d'uscita è cercare una finestra Metatrader nella lista di tutte le finestre usando FindWindowExA(...)
 
Meat:

In modalità di visualizzazione, la maniglia può essere letta senza problemi. Ma dovete testare NON in modalità visiva. Allora ha senso: niente finestra, niente maniglia. Per quanto riguarda le altre finestre aperte, capisco che non sono accessibili dal tester.
In questo caso, l'unica via d'uscita è cercare la finestra richiesta nella lista di tutte le finestre usando FindWindowExA(...).

Sì, ho provato ad applicare il codice di Ilnur da pagina 5:


Ilnur:

Ecco un esempio di uno script che avvia un tester di strategia e aspetta che sia completato. Il testo del pulsante viene letto con GetWindowTextA().

È interessante notare che la finestra del tester non deve necessariamente essere visibile in questo caso.

Ma dal tester questo trucco non ha funzionato. (Sto lanciando un altro terminale per l'ottimizzazione da tester e voglio tracciare il completamento di questo processo).

Se non è troppo difficile, puoi darmi un esempio per FindWindowExA(...) o un link?

 

Qui ho una tale funzione per trovare una finestra:

#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);
}
 

Cercate il nome della classe e il titolo della finestra richiesta in SPY++.

Ho commentato il controllo dell'ID del thread perché non è necessario in questo caso (non c'è una finestra di origine da confrontare).

In generale, vi consiglio di gestire le funzioni WinAPI, se avete intenzione di usarle. Fate riferimento a MSDN(http://msdn.microsoft.com/en-us/library/ff818516.aspx) per una descrizione dettagliata delle funzioni.

 
cm=GetDlgItem(hdlg,ID_SYMBOL);
int pos=InviareMessaggioA(cm,CB_GETCOUNT,0,0);//ottenere il numero nella lista
/trovare la coppia
stringa fs=";
for(int l=0;l<pos;l++){
int ll=SendMessageA(cm,CB_GETLBTEXT,l,fs);
Stampa(ll," ", fs);
}

come ottenere correttamente un elenco di strumenti nella finestra dell'ordine (F9)?

Ottengo il numero di elementi, ma non posso ottenere esattamente le righe per numero, restituisce -1.

#define ID_SYMBOL 0x053E //nome del carattere da selezionare

cmhandle ComboBox


 
Meat:

Qui ho tale funzione per la ricerca delle finestre:


Alexey, grazie, la funzione funziona, ma...
Carne:

Ho commentato il controllo dell'ID del flusso perché non è necessario in questo caso (non abbiamo una finestra di origine da confrontare).


È necessario solo l'ID del filo, dato che ho due terminali coinvolti.

Ne sono uscito attraverso l'identificazione della testata, ma vorrei ancora sapere come determinare l'ID del flusso da sotto il tester?