Düğme ve fare tıklamalarının durdurulmasıyla otomasyon. - sayfa 9

 
YuraZ >> :

SP2 XPPRO

Yazılım sürekli olarak ve makineye çok fazla yüklenmişse, o zaman her şey olabilir.

AXIS hedefse - kararlı, kanıtlanmış küçük bir görev kümesi dönüyorsa veya bir

yani, bir sürü programa değmez, bir şeyler sürekli yıkılıyor ve oraya pek çok şey konmuyor

genellikle sorun olmaz


Kitaplığım çok daha küçük. Değiştirdim, hatta 1 kez uzman değiştirmenin nasıl mümkün olduğunu gördüm ama terminal düştü. Yeniden başlatıldı, artık çalışmıyor. Çıkışlar -1, yani komut yanlış. Neyin yanlış olduğu açık olmasa da, çünkü. 1 kez çalıştı.


Farklı işletim sistemlerinde sanal bir makinede oynamaya karar verdim.

 
HIDDEN >> :

Bilgisayarda ve ağda user32.dll kütüphane dosyasına baktım, farklı boyutlarda bir çok dosya var.

Belki de benim sorunum kütüphanenin kendisinin bir eğri olmasıdır.


İlnur, zor değilse kütüphanenin versiyonunu buraya yaz, onunla test etmeye çalışacağım.

Yuraz, İlnur'un kodlarına veya benimkine göre fonksiyonun adını bulmayı ve değiştirmeyi başardın, zor değilse kütüphaneni de düzenle.

XP Pro SP3'üm var.

Kitaplığı ekledi.

Dosyalar:
user32_1.zip  305 kb
 

Gönderilen kitaplıkları denedim, komut dosyası çalıştırıldığında terminal sürekli çöküyor.

Çıplak, temiz bir Windows koydum, aynı çöp, monitöre alnınız ile vurduğunuz halde anahtar çalışmıyor.


Ne yapacağımı bilmiyorum. Tam bir çıkmazda, uygulama girişimini tekrar daha iyi bir zamana kadar ertelemek .....

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

GİZLİ 04.05.2009 14:20



Ayrıca kendi başınıza ... giriş tarihi için gerekli klavye kodlarının oluşumu anlamında


 


Belki LVN_ COLUMNCLICK işlevi uygundur, ancak bir şeyler yolunda gitmiyor.

 

F9 (Sipariş) tarafından çağrılan pencereyi nasıl yakalayacağımı söyle

Metin aranmaz.

Şimdiye kadar böyle yakaladım:

 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
}

Rusça MT'de pencere tutamacı sipariş edin

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

--------

Windows'ta kaynak kimliklerini bulmak için Spy++ kullanın

 

bu yalnızca terminalde Rusça seçiliyse çalışır, ancak örneğin müşterinin terminalinde Çince varsa?

Çince arama yapmak için?) Başka bir yola ihtiyacımız var.

belirttiğim seçenek çalışırken.

 

DKeN :

belirttiğim seçenek çalışırken.

Tebrikler, o zaman ne istiyorsunuz?

sadece bu F9'da bulunan bazı benzersiz kaynaklar için pencerelere bakabilirsiniz.

 

FindWindowA'dan sonra, bulunan pencere için iş parçacığı / işlem kimliğini de kontrol etmeniz gerekir (GetWindowThreadProcessId işlevi), çünkü bulunan sipariş penceresi metatrader'ın başka bir kopyasına ait olabilir.

Neden: