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

 
YuraZ >> :

SP2 XPPRO

Se c'è molto software installato sulla macchina, può succedere di tutto.

Se il vostro sistema operativo di destinazione esegue un piccolo insieme stabile e testato di compiti o un

cioè un mucchio di programmi non vengono costantemente cancellati e un sacco di cose non vengono installate

di solito non ci sono problemi.


Ho una biblioteca molto più piccola. Sostituito, visto una volta è riuscito a sostituire l'esperto nella linea, ma il terminale si è bloccato. Ho provato ancora una volta, ma non funziona. Visualizza -1, cioè il comando non è corretto. Anche se non è chiaro cosa ci sia di sbagliato, perché una volta ha funzionato.


Ho deciso di giocare in una macchina virtuale su diversi sistemi operativi.

 
HIDDEN >> :

Ho guardato il file di libreria user32.dll sul mio computer e in rete e ci sono un sacco di file di dimensioni diverse.

Forse il mio problema è che la biblioteca stessa è storta.


Ilnur, se non ti dispiace postare qui la tua versione della libreria, proverò a testarla.

Yuraz, e puoi trovare e sostituire il nome della funzione nei codici Ilnur o il mio, se non è difficile esporre anche la tua libreria.

Ho XP Pro SP3.

Biblioteca allegata.

File:
user32_1.zip  305 kb
 

Provato le librerie, il terminale va sempre in crash quando si esegue lo script.

Ho installato un Windows nudo e pulito, la stessa cosa, l'interruttore non funziona, anche se si picchia il monitor.


Non so cosa fare. Sono a un punto morto, rimanderò il tentativo di implementarlo di nuovo fino a tempi migliori.....

 
// Зайцев Ю. В. 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);
}

NASCOSTO 04.05.2009 14:20



Più avanti voi stessi ... nel senso di generare i giusti codici della tastiera ,,,, per la data inserita


 


Forse la funzione LVN_COLUMNCLICK è adatta , ma non funziona.

 

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

Non riesco a trovarlo per testo.

Finora è stato catturato come segue:

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
}

Mandato per la maniglia della finestra in Russian MT

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

--------

Usare Spy++ per cercare gli identificatori di risorse nelle finestre

 

Questo funziona solo se il russo è selezionato nel terminale, ma se, per esempio, il cliente ha il cinese nel terminale?

Ho bisogno di un altro modo per cercare in cinese.

Finora, l'opzione che ho menzionato funziona.

 

DKeN:

a patto che l'opzione che ho menzionato funzioni.

congratulazioni, cosa vuoi allora?

è possibile cercare nelle finestre alcune risorse uniche che sono disponibili solo in questa con F9.

 

Dopo FindWindowA dovresti anche controllare l'ID del thread/processo per la finestra trovata (funzione GetWindowThreadProcessId), perché la finestra dell'ordine trovata potrebbe appartenere a un'altra copia di metatrader.

Motivazione: