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

 
DKeN:

¿Pueden decirme cómo atrapar la ventana llamada por F9 (Orden)?

No se puede encontrar por texto.

Hasta ahora ha sido capturado de la siguiente manera:

Esto no me parece en absoluto una forma fiable. Intente abrir alguna otra ventana cuando la ventana de la orden esté abierta, por ejemplo las propiedades del gráfico, o la configuración del terminal, o las variables globales, etc. ¿Qué ventana le mostrará GetLastActivePopup?
 

¡Hola!

¿Pueden decirme cómo determinar el descriptor MT de un EA que se ejecuta en el probador?

La construcción:

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

Devuelve 0.

 

¿Está abierto un gráfico como éste en este momento? (con el símbolo y el punto especificados)

 
Meat:

¿Está abierto un gráfico como éste en este momento? (con símbolo y punto especificados)

Sí, por supuesto.

Lo he probado de las dos maneras.

¿O es una característica de la función WindowHandle (aunque no hay ninguna palabra al respecto en la ayuda...)

O tal vez soy tonto...

 
lasso:

Sí, por supuesto.

Lo he probado de las dos maneras.

O es una peculiaridad de la función WindowHandle (aunque la ayuda no dice nada al respecto...)

O tal vez soy tonto...

En el modo de visualización, el mango funciona sin problemas. Y es probable que no esté probando en modo visual. Entonces tiene sentido: si no hay ventana, no hay asa. En cuanto a las otras ventanas abiertas, según tengo entendido, no son accesibles desde el probador.
En ese caso, la única salida es buscar una ventana de Metatrader en la lista de todas las ventanas utilizando FindWindowExA(...)
 
Meat:

En el modo de visualización, la manilla se puede leer sin problemas. Pero debes estar probando NO en modo visual. Entonces tiene sentido: si no hay ventana, no hay asa. En cuanto a las otras ventanas abiertas, entiendo que no son accesibles desde el probador.
En ese caso, la única salida es buscar la ventana requerida en la lista de todas las ventanas utilizando FindWindowExA(...).

Sí, he intentado aplicar el código de Ilnur de la página 5:


Ilnur:

Este es un ejemplo de un script que inicia un probador de estrategias y espera a que se complete. El texto del botón se lee con GetWindowTextA().

Curiosamente, la ventana del probador no tiene que ser necesariamente visible en este caso.

Pero desde el probador este truco no funcionó. (Voy a lanzar otro terminal para la optimización desde el probador y quiero hacer un seguimiento de la finalización de este proceso).

Si no es muy difícil, ¿puedes darme un ejemplo para FindWindowExA(...) o un enlace?

 

Aquí tengo una función de este tipo para encontrar una ventana:

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

Busque el nombre de la clase y el título de la ventana requerida en SPY++.

He comentado la comprobación del ID del hilo porque no es necesaria en este caso (no hay ventana de origen para comparar).

En general, te aconsejo que manejes las funciones WinAPI, si las vas a utilizar. Consulte MSDN(http://msdn.microsoft.com/en-us/library/ff818516.aspx) para obtener una descripción detallada de las funciones.

 
cm=GetDlgItem(hdlg,ID_SYMBOL);
int pos=EnviarMensajeA(cm,CB_GETCOUNT,0,0);//obtener el número de la lista
//encontrar el par
cadena fs=";
for(int l=0;l<pos;l++){
int ll=EnviarMensajeA(cm,CB_GETLBTEXT,l,fs);
Print(ll," ",fs);
}

Por favor, indíqueme cómo obtener correctamente una lista de herramientas en la ventana de pedidos (F9).

Obtengo el número de elementos, pero no puedo obtener exactamente las filas por número, devuelve -1.

#define ID_SYMBOL 0x053E //nombre del carácter a seleccionar

cmhandle ComboBox


 
Meat:

Aquí tengo esa función para la búsqueda de ventanas:


Alexey, gracias, la función funciona, pero...
Lacarne:

He comentado la comprobación del ID de flujo porque no es necesaria en este caso (no tenemos una ventana de origen para comparar).


Sólo se necesita la identificación del hilo, ya que tengo dos terminales involucrados.

Salí de ella a través de la identificación de la cabecera, pero todavía me gustaría saber cómo determinar el ID de flujo de debajo del probador?

Razón de la queja: