ボタンやマウスクリックの傍受による自動化。 - ページ 9

 
YuraZ >> :

SP2 XPPRO

多くのソフトウェアがインストールされているマシンでは、何が起こっても不思議ではありません。

ターゲットOSが安定したテスト済みの小さなタスク群を実行している場合、または1つの

つまり、多くのプログラムが常に実行されているわけでもなく、多くのものがインストールされているわけでもない

通常は問題ありません。


私はもっと小さな図書館を持っています。交換し、回線内のエキスパートを一度見てなんとか交換したが、端末がクラッシュした。もう一度やってみたが、うまくいかなかった。1と表示される。つまり、コマンドが正しくない。何が問題なのかは不明ですが、一度は成功したのですから。


異なるOS上の仮想マシンで遊んでみることにした。

 
HIDDEN >> :

私のパソコンとネットでuser32.dllのライブラリファイルを見てみると、大きさの違うファイルがたくさんあります。

私の問題は、図書館そのものが曲がっていることなのかもしれません。


Ilnurさん、もしよろしければ、あなたのライブラリのバージョンをここに載せていただけませんか?

Yuraz、およびあなたは、あまりにもあなたのライブラリを公開することは困難ではない場合、コードIlnurまたは鉱山で関数名を見つけると交換することができます。

XP Pro SP3を持っています。

図書館併設。

ファイル:
user32_1.zip  305 kb
 

ライブラリを試したところ、スクリプトを実行すると必ずターミナルがクラッシュしてしまいます。

素のクリーンなWindowsをインストールしたところ、同じように、モニターをブローしても、スイッチが作動しません。


どうしたらいいんだろう。完全に行き詰ってしまったので、再実装はもっといい時期まで先延ばしにしようと思います......。

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

隠れ 2009.05.04 14:20



さらに自分自身について ... 入力された日付に対して正しいキーパッド・コードを生成するという意味において


 


おそらく、LVN_COLUMNCLICK 関数が適しているのでしょうが、うまくいきません。

 

F9(Order)で呼び出されたウィンドウをキャッチする方法を教えてください。

テキストで探すことができない。

これまでのところ、以下のように捕捉されています。

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
}

ロシア語MTの保証書付きウィンドウハンドル

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

--------

Spy++を使用して、ウィンドウズでリソース識別子を検索する

 

これは端末でロシア語が選択されている場合のみ有効ですが、例えばクライアントが端末で中国語を選択していた場合?

中国語で検索する別の方法が必要です。

今のところ、私が言ったオプションが有効です。

 

DKeN:

は、私が言ったオプションが動作する限り。

おめでとうございます、では何が欲しいのですか?

は、F9でこの1枚にしかないユニークな資料をウィンドウズで検索することができます。

 

FindWindowA の後、見つかったウィンドウのスレッド/プロセス ID も確認する必要があります(関数 GetWindowThreadProcessId)、これは見つかったオーダーウィンドウが別のメタトレーダーのコピーに属している可能性があるからです。