Automatisation avec interception des boutons et des clics de souris. - page 9

 
YuraZ >> :

SP2 XPPRO

S'il y a beaucoup de logiciels installés sur la machine, tout peut arriver.

Si votre système d'exploitation cible exécute un petit ensemble stable et testé de tâches ou une

c'est-à-dire qu'un tas de programmes ne sont pas constamment supprimés et que beaucoup de choses ne sont pas installées.

il n'y a généralement pas de problème.


J'ai une bibliothèque beaucoup plus petite. Je l'ai remplacé, j'ai réussi à remplacer l'expert de la ligne, mais le terminal a planté. J'ai essayé une fois de plus mais ça ne marchait pas. Il affiche -1, c'est-à-dire que la commande est incorrecte. Bien que ce qui ne va pas ne soit pas clair, parce que ça a marché une fois.


J'ai décidé de m'amuser dans une machine virtuelle sur différents systèmes d'exploitation.

 
HIDDEN >> :

J'ai regardé le fichier de la bibliothèque user32.dll sur mon ordinateur et sur le net et il y a un tas de fichiers de tailles différentes.

Peut-être que mon problème est que la bibliothèque elle-même est tordue.


Ilnur, si vous voulez bien poster votre version de la bibliothèque ici, je vais essayer de la tester.

Yuraz, et vous pouvez trouver et remplacer le nom de la fonction dans les codes Ilnur ou le mien, si pas difficile d'exposer votre bibliothèque aussi.

J'ai XP Pro SP3.

Bibliothèque jointe.

Dossiers :
user32_1.zip  305 kb
 

J'ai essayé les bibliothèques, le terminal se plante toujours lors de l'exécution du script.

J'ai installé un Windows nu, propre, la même chose, le commutateur ne fonctionne pas, même si vous broyez le moniteur.


Je ne sais pas quoi faire. Je suis dans une impasse totale, je vais remettre à plus tard l'implémentation de ce système jusqu'à ce qu'il y ait du mieux. .....

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

CACHÉ 04.05.2009 14:20



Plus loin, vous... dans le sens où elle génère les bons codes de clavier,,,, pour la date d'entrée.


 


La fonction LVN_COLUMNCLICK convient peut-être , mais elle ne fonctionne pas.

 

Pouvez-vous me dire comment attraper la fenêtre appelée par F9 (Ordre) ?

Je ne peux pas le trouver par texto.

Jusqu'à présent, il a été pris comme suit :

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
}

Poignée de fenêtre de mandat dans le MT russe

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

--------

Utiliser Spy++ pour rechercher des identifiants de ressources dans les fenêtres

 

Cela ne fonctionne que si le russe est sélectionné dans le terminal, mais si, par exemple, le client a le chinois dans le terminal ?

J'ai besoin d'un autre moyen pour effectuer des recherches en chinois.

Pour l'instant, l'option que j'ai mentionnée fonctionne.

 

DKeN:

tant que l'option que j'ai mentionnée fonctionne.

Félicitations, que voulez-vous alors ?

vous pouvez rechercher dans les fenêtres certaines ressources uniques qui ne sont disponibles que dans celle-ci par F9.

 

Après FindWindowA, vous devez également vérifier le thread/process ID de la fenêtre trouvée (fonction GetWindowThreadProcessId), car la fenêtre d'ordre trouvée peut appartenir à une autre copie de metatrader.