Automatisierung mit Abfangen von Tasten und Mausklicks. - Seite 9

 
YuraZ >> :

SP2 XPPRO

Wenn viel Software auf dem Rechner installiert ist, kann alles passieren.

Wenn Ihr Zielbetriebssystem eine kleine, stabile und getestete Gruppe von Tasks ausführt oder eine

d.h. viele Programme werden nicht ständig heruntergefahren und viele Dinge werden nicht installiert

ist das normalerweise kein Problem.


Ich habe eine viel kleinere Bibliothek. Ersetzte es, sah einmal gelungen, den Experten in der Linie zu ersetzen, aber das Terminal abgestürzt. Ich habe es noch einmal versucht, aber es hat nicht funktioniert. Es wird -1 angezeigt, d.h. der Befehl ist falsch. Es ist allerdings unklar, woran es liegt, denn es hat einmal funktioniert.


Ich habe beschlossen, in einer virtuellen Maschine auf verschiedenen Betriebssystemen herumzuspielen.

 
HIDDEN >> :

Ich habe mir die Bibliotheksdatei user32.dll auf meinem Computer und im Internet angesehen, und es gibt eine ganze Reihe von Dateien unterschiedlicher Größe.

Vielleicht ist mein Problem, dass die Bibliothek selbst schief ist.


Ilnur, wenn es dir nichts ausmacht, deine Version der Bibliothek hier zu posten, werde ich versuchen, sie zu testen.

Yuraz, und Sie können finden und ersetzen Sie den Namen der Funktion in den Codes Ilnur oder meine, wenn nicht schwierig, Ihre Bibliothek auch auszusetzen.

Ich habe XP Pro SP3.

Bibliothek beigefügt.

Dateien:
user32_1.zip  305 kb
 

Ich habe die Bibliotheken ausprobiert, aber das Terminal stürzt immer ab, wenn ich das Skript ausführe.

Ich habe ein nacktes, sauberes Windows installiert, das Gleiche, der Schalter funktioniert nicht, auch wenn man den Monitor anpöbelt.


Ich weiß nicht, was ich tun soll. Ich bin völlig ratlos und habe den Versuch der Umsetzung wieder einmal aufgeschoben, bis bessere Zeiten kommen.....

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

VERSTECKT 04.05.2009 14:20



Weiter zu Ihnen selbst ... im Sinne der Generierung der richtigen Tastaturcodes,,,, für das eingegebene Datum


 


Vielleicht ist die Funktion LVN_COLUMNCLICK geeignet , aber sie funktioniert nicht.

 

Können Sie mir sagen, wie ich das mit F9 (Auftrag) aufgerufene Fenster abfangen kann?

Ich kann sie nicht per Text finden.

Bislang wurde sie wie folgt gefangen:

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
}

Haftbefehl Fenstergriff in Russian MT

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

--------

Verwenden Sie Spy++, um in Fenstern nach Ressourcenbezeichnern zu suchen

 

Das funktioniert nur, wenn im Terminal Russisch ausgewählt ist, aber wenn der Kunde zum Beispiel Chinesisch im Terminal hat?

Ich brauche eine andere Möglichkeit, auf Chinesisch danach zu suchen.

Bislang funktioniert die von mir genannte Option.

 

DKeN:

solange die von mir genannte Option funktioniert.

Herzlichen Glückwunsch, was wollen Sie dann?

können Sie in den Fenstern nach einigen einzigartigen Ressourcen suchen, die nur in diesem einen Fenster verfügbar sind (F9).

 

Nach FindWindowA sollten Sie auch die Thread/Prozess-ID für das gefundene Fenster überprüfen (Funktion GetWindowThreadProcessId), da das gefundene Auftragsfenster zu einer anderen Metatrader-Kopie gehören kann.