Automação com interceptação por botão e clique do mouse. - página 9

 
YuraZ >> :

SP2 XPPRO

Se houver muito software instalado na máquina, tudo pode acontecer.

Se seu SO alvo executa um pequeno conjunto estável e testado de tarefas ou um

ou seja, muitos programas não estão sendo executados constantemente e muitas coisas não estão sendo instaladas

geralmente não há problema.


Eu tenho uma biblioteca muito menor. Substituiu-a, uma vez a serra conseguiu substituir o especialista na linha, mas o terminal caiu. Eu tentei mais uma vez, mas não funcionou. Ele exibe -1, ou seja, o comando está incorreto. Embora o que está errado não esteja claro, porque funcionou uma vez.


Decidiram brincar em uma máquina virtual em diferentes sistemas operacionais.

 
HIDDEN >> :

Olhei o arquivo da biblioteca user32.dll no meu computador e na rede e há um monte de arquivos de tamanhos diferentes.

Talvez o meu problema seja que a própria biblioteca esteja torta.


Ilnur, se você não se importa de colocar aqui sua versão da biblioteca, tentarei testá-la com ela.

Yuraz, e você pode encontrar e substituir o nome da função nos códigos Ilnur ou meu, se não for difícil expor sua biblioteca também.

Eu tenho XP Pro SP3.

Biblioteca anexa.

Arquivos anexados:
user32_1.zip  305 kb
 

Tentei as bibliotecas, o terminal sempre trava ao executar o roteiro.

Eu instalei um Windows limpo e nu, a mesma coisa, o interruptor não funciona, mesmo que você navegue no monitor.


Eu não sei o que fazer. Estou em um impasse total, vou adiar a tentativa de implementá-lo novamente até tempos melhores.....

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



Mais além de vocês mesmos ... no sentido de gerar os códigos de teclado corretos,,,, para a data de entrada


 


Talvez a função LVN_COLUMNCLICK seja adequada , mas não funciona.

 

Você pode me dizer como pegar a janela chamada por F9 (Ordem)?

Não é possível encontrá-lo por texto.

Até o momento, foi pego da seguinte forma:

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
}

Manípulo da janela do mandado em MT russo

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

--------

Use Spy++ para pesquisar identificadores de recursos no Windows

 

Isso só funciona se o russo for selecionado no terminal, mas se, por exemplo, o cliente tiver chinês no terminal?

Preciso de outra maneira de procurá-lo em chinês.

Até agora, a opção que mencionei funciona.

 

DKeN:

desde que a opção que mencionei funcione.

parabéns, o que você quer então?

você pode procurar nas janelas por alguns recursos exclusivos que só estão disponíveis neste pela F9.

 

Depois de FindWindowA você também deve verificar a janela encontrada (função GetWindowThreadProcessId), pois a janela de ordem encontrada pode pertencer a outra cópia do metatrader.