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

 
YuraZ >> :

SP2 XPPRO

Si hay mucho software instalado en la máquina, puede pasar cualquier cosa.

Si su sistema operativo de destino ejecuta un pequeño conjunto estable y probado de tareas o una

es decir, no se están ejecutando constantemente muchos programas y no se están instalando muchas cosas

no suele haber ningún problema.


Tengo una biblioteca mucho más pequeña. Lo he sustituido, he visto que una vez conseguí sustituir al experto en la línea, pero el terminal se estropeó. Lo intenté una vez más pero no funcionó. Muestra -1, es decir, el comando es incorrecto. Aunque no está claro qué es lo que falla, porque una vez funcionó.


Decidí jugar en una máquina virtual en diferentes sistemas operativos.

 
HIDDEN >> :

He mirado el archivo de la biblioteca user32.dll en mi ordenador y en la red y hay un montón de archivos de diferentes tamaños.

Quizás mi problema es que la propia biblioteca está torcida.


Ilnur, si no te importa publicar aquí tu versión de la biblioteca, intentaré hacer pruebas con ella.

Yuraz, y usted puede encontrar y reemplazar el nombre de la función en los códigos Ilnur o la mía, si no es difícil de exponer su biblioteca también.

Tengo XP Pro SP3.

Biblioteca adjunta.

Archivos adjuntos:
user32_1.zip  305 kb
 

Probé las bibliotecas, el terminal siempre se bloquea al ejecutar el script.

Instalé un Windows desnudo y limpio, lo mismo, el interruptor no funciona, aunque se amedrente el monitor.


No sé qué hacer. Estoy completamente parado, voy a aplazar el intento de ponerlo en práctica de nuevo hasta mejores tiempos.....

 
// Зайцев Ю. В. YURAZ
//
// программируем на API 
// передать данные в SysDateTimePick32 можно через ХУК ,  но хуки не люблю  
// потому проколотим дату кнопками ввода
// 
// 


#define GW_HWNDNEXT                    2

#define WM_ACTIVATE                    0x0006
#define WM_ENABLE                      0x000A
#define WM_SETFOCUS                    0x0007

#define WM_KEYDOWN                     0x0100
#define WM_KEYUP                       0x0101

#define VK_TAB                         0x09
#define VK_RIGHT                       0x27


#define GW_CHILD                       5

// ID 
#define _ID_TESTER                     0x053      // дескриптор ТЕСТЕРА     
#define _ID_TW                         0x81BF     // дескриптор окна TESTERA
#define _ID_TERMINAL                   0xE81E

#define _ID_NAV                        0xE81B     // навигатор


#import "user32.dll"
   int      SendMessageA(int hWnd,int Msg,int wParam,string lParam);
   int      PostMessageA(int hWnd,int Msg,int wParam,int lParam);
   int      GetWindowTextA(int hWnd,string lpString,int nMaxCount);
   int      GetDlgItem(int hDlg, int nIDDlgItem);
   int      GetAncestor(int hWnd, int gaFlags);
   int      GetWindow(int hWnd,int uCmd);
#import


void start()
{


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

   int hTerminal = GetDlgItem( hMetaTrader, _ID_TERMINAL );                                // Дескриптор окна валютной пары
   Print("hTerminal = ", hTerminal," || ", DecToHex( hTerminal));

   int hTester = GetDlgItem( hTerminal, _ID_TESTER );                                     // Дескриптор окна тестера стратегий
   Print("hTester = ", hTester," || ", DecToHex( hTester));   

// хитро вычисляем окошко объекта 
   int hOt  =  GetWindow( FindHendlKey( GetDlgItem( hTester,_ID_TW), "От:" ), GW_HWNDNEXT);
   Print("hOt = ", hOt," || ", DecToHex( hOt));  // для отладки покажем HENDL окна ввода даты

//
// тупо нажимаем дату  2001.03.27
//
    SendMessageA ( hOt, WM_ACTIVATE ,       1,  0 ); // Активизируем
    SendMessageA ( hOt, WM_ENABLE   ,       1,  0 );
    SendMessageA ( hOt, WM_SETFOCUS ,       1,  0 );

 
    PostMessageA ( hOt, WM_KEYDOWN  ,       0x032   ,  1 ); //  0x32 код '2'
    Sleep(1000);
    PostMessageA ( hOt, WM_KEYDOWN  ,       0x030   ,  1 ); //  
    Sleep(1000);
    PostMessageA ( hOt, WM_KEYDOWN  ,       0x030   ,  1 ); //
    Sleep(1000);
    PostMessageA ( hOt, WM_KEYDOWN  ,       0x031   ,  1 ); // 2001 
    Sleep(1000);
    PostMessageA ( hOt, WM_KEYDOWN  ,       VK_RIGHT,  1 ); // .
    Sleep(1000);
    PostMessageA ( hOt, WM_KEYDOWN  ,       0x030   ,  1 ); // 12
    Sleep(1000);
    PostMessageA ( hOt, WM_KEYDOWN  ,       0x033   ,  1 ); // 03
    Sleep(1000);
    PostMessageA ( hOt, WM_KEYDOWN  ,       VK_RIGHT,  1 ); // .
    Sleep(1000);
    PostMessageA ( hOt, WM_KEYDOWN  ,       0x032   ,  1 ); //  27
    Sleep(1000);
    PostMessageA ( hOt, WM_KEYDOWN  ,       0x037   ,  1 ); // 
    Sleep(1000);
    SendMessageA ( hOt, WM_KEYDOWN  ,       VK_TAB  ,  0 );
    Sleep(1000);
 
}

 
 
 
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
string DecToHex(int n)
  {
   string s = "", c;
   while( n != 0)
     {
      if( n%16 < 10)
          c = CharToStr( n % 16 + '0');
      else 
          c = CharToStr( n % 16 + 'A'-10);
      s = c + s;
      n = n / 16;
     }
   return( s);
  }

//+------------------------------------------------------------------+
//
// прощелкать объекты
// ищем объект по имени 
//
//+------------------------------------------------------------------+

int FindHendlKey( int Current, string findname )
{
  string p1=  "012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234";
  int temp = GetWindow( Current , GW_CHILD );                   // ищем
  while ( temp != NULL )
  {
     GetWindowTextA( temp , p1 , StringLen( findname )+1 ); 
     if ( p1 == findname)
     {                                                          // проверим а не  тот ли это объект
        return( temp ); // это то что мы ищем
     }
     int r =   FindHendlKey( temp  ,   findname   ) ;           // не значит не она , обойдем ее дочерние объекты
     if ( r != NULL )
     {
        return ( r);                                             // опс нашли дочку
     }
     temp = GetWindow( temp , GW_HWNDNEXT );                    // проверяем следующий объект, дочерний 
  }
  return (0);
}

OCULTO 04.05.2009 14:20



Más allá de ustedes mismos ... en el sentido de generar los códigos de teclado adecuados,,,, para la fecha introducida


 


Quizás la función LVN_COLUMNCLICK sea adecuada , pero no funciona.

 

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

int hwnd=GetAncestor(WindowHandle(name,Period()),2);//main terminal handle

string s=""; 

hdlg=GetLastActivePopup(hwnd);//FindWindowA(0,s);

 if(hdlg!=hwnd){

         GetWindowTextA(hdlg,s,GetWindowTextLengthA(hdlg)+1);//работает, надо s=""   

         Print(s);

} 
 
//------------------------------------------------------------------    F9
void F9()
{
        int h=WindowHandle(Symbol(),Period());  // хэндл графика
        int hMetaTrader=GetAncestor(h, 2);  // хэндл МТ
        PostMessageA(h, WM_COMMAND, 35458, 0); // открываем F9
}

Manilla de la ventana Warrant en Russian MT

        int h=FindWindowA ("#32770", "Ордер");

--------

Utilice Spy++ para buscar identificadores de recursos en las ventanas

 

Esto sólo funciona si se selecciona el ruso en el terminal, pero si, por ejemplo, el cliente tiene el chino en el terminal?

Necesito otra forma de buscar en chino.

Hasta ahora, la opción que mencioné funciona.

 

DKeN:

siempre y cuando la opción que he mencionado funcione.

Enhorabuena, ¿qué quieres entonces?

puedes buscar en las ventanas algunos recursos únicos que sólo están disponibles en ésta mediante F9.

 

Después de FindWindowA debe comprobar también el ID del hilo/proceso para la ventana encontrada (función GetWindowThreadProcessId), porque la ventana de orden encontrada puede pertenecer a otra copia de metatrader.