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

 
DKeN :

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

Metin aranmaz.

Şimdiye kadar böyle yakaladım:

Bunun çok güvenilir bir yol olduğunu düşünmüyorum. Sipariş penceresi açıkken başka bir pencere açmayı deneyin, örneğin grafik özellikleri veya terminal ayarları veya global değişkenler vb. GetLastActivePopup size hangi pencereyi verecek?
 

Merhaba!

Test cihazında çalışan Expert Advisor'dan MT tanımlayıcısını nasıl belirleyeceğimi söyler misiniz?

Tasarım:

 int hMetaTrader = GetAncestor ( WindowHandle ( Symbol ( ) , Period ( ) ) , 2 ) ;                // Дескриптор основного окна терминала
çalışmıyor, çünkü
 WindowHandle ( Symbol ( ) , Period ( ) )

0 döndürür.

 

Program şu anda açık mı? (belirtilen sembol ve nokta ile)

 
Meat :

Program şu anda açık mı? (belirtilen sembol ve nokta ile)

Tabiiki.

Bu şekilde denedim.

Yoksa WindowHandle işlevinin bir özelliği mi (yardımda bununla ilgili bir kelime olmamasına rağmen ...)

yoksa aptal mıyım...

 
lasso :

Tabiiki.

Bu şekilde denedim.

Yoksa WindowHandle işlevinin bir özelliği mi (yardımda bununla ilgili bir kelime olmamasına rağmen ...)

yoksa aptal mıyım...

Görselleştirme modunda, tutamaç sorunsuz bir şekilde elde edilir. Ve muhtemelen görsel modda DEĞİL'i test ediyorsunuz. O zaman her şey mantıklı: pencere yok, tutamaç yok. Açık pencerelerin geri kalanına gelince, anladığım kadarıyla bunlar test cihazında mevcut değil.
Bu durumda, tek çıkış yolu FindWindowExA(...) kullanarak tüm pencereler listesinde Metatrader penceresini aramaktır.
 
Meat :

Görselleştirme modunda, tutamaç sorunsuz bir şekilde elde edilir. Ve muhtemelen görsel modda DEĞİL'i test ediyorsunuz. O zaman her şey mantıklı: pencere yok, tutamaç yok. Açık pencerelerin geri kalanına gelince, anladığım kadarıyla bunlar test cihazında mevcut değil.
Bu durumda, tek çıkış yolu FindWindowExA(...) kullanarak tüm pencereler listesinde gerekli pencereyi aramaktır.

Evet, beşinci sayfanın İlnur ' ac kodunu uygulamaya çalıştım:


Ilnur :

İşte strateji test cihazını başlatan ve tamamlanmasını bekleyen bir komut dosyası örneği. Düğme metni GetWindowTextA() işlevi kullanılarak okunur.

İlginç bir şekilde, test penceresinin görünür olması gerekmez.

Ancak bu yanılsama testçiden geçmedi. (Optimizasyon için test cihazından başka bir terminal çalıştırıyorum ve bu işlemin tamamlandığını izlemek istiyorum.)

Eğer zorlaştırmıyorsa FindWindowExA (...) için bir örnek veya link verebilir misiniz?

 

İşte benim pencere arama fonksiyonum:

 #import "user32.dll"
   int FindWindowExA( int hwndParent, int hwndChildAfter, string lpClassName, string lpWindowName);       
  int GetWindowThreadProcessId( int hWnd, int lpdwProcessId);
   int GetWindowTextA( int hWnd, string lpString, int nMaxCount);
#import

//инициализируем текстовый буффер длиной 128 байт. Вообще должен быть 255 байт! Но он не влезает на экран, из-за чего окно форума сильно растягивается :)
string  textbuf= "АбвгдежзийклмнопрстуфхцчшщъыьэюяАбвгдежзийклмнопрстуфхцчшщъыьэюяАбвгдежзийклмнопрстуфхцчшщъыьэюяАбвгдежзийклмнопрстуфхцчшщъыьэюя" ;

int FindWindow( string class , string caption, bool captionexactly= false )
{    
   //int CurrentThreadID=GetWindowThreadProcessId(WindowHandle(Symbol(),Period()),0);
   string null_string;
   int h= 0 ;
   while ( true )
  {    
     if (captionexactly)
      h=FindWindowExA( 0 ,h, class ,caption);
     else
      h=FindWindowExA( 0 ,h, class ,null_string);
     if (h== 0 ) return ( 0 );
     //if (GetWindowThreadProcessId(h,0)!=CurrentThreadID) continue;
     if (captionexactly) return (h);
    int len=StringLen(caption);
    if (GetWindowTextA(h,textbuf,128)<len) continue ;
    if (StringSubstr(textbuf,0,len)==caption) return (h);  
  }
   return ( 0 );
}
 

SPY++'da sınıfın adını ve gerekli pencerenin başlığını arayın.

Konu kimliği kontrolünü yorumladım, çünkü bu durumda gerekli değildir (karşılaştırma için bir kaynak penceremiz yoktur).

Genel olarak eğer kullanacaksanız WinAPI fonksiyonları ile uğraşmanızı tavsiye ederim. İşlevlerin ayrıntılı açıklaması için MSDN'ye bakın ( http://msdn.microsoft.com/en-us/library/ff818516.aspx )

 
cm=GetDlgItem(hdlg,ID_SYMBOL);
int pos=SendMessageA(cm,CB_GETCOUNT,0,0);//listedeki miktarı al
// bir çift bul
dizi fs="";
for(int l=0;l<pos;l++){
int ll=SendMessageA(cm,CB_GETLBTEXT,l,fs);
Yazdır (ll," ",fs);
}

Sipariş penceresindeki (F9) enstrüman listesini nasıl alacağımı söyle?

Eleman sayısını alıyorum, ancak tam olarak satırları sayıya göre alamıyorum, -1 döndürüyor.

#define ID_SYMBOL 0x053E //seçilecek sembol adı

cm tutamaç ComboBox


 
Meat :

İşte benim pencere arama fonksiyonum:


Alexey, teşekkürler, işlev çalışıyor, ama ..
Et :

Konu kimliği kontrolünü yorumladım, çünkü bu durumda gerekli değildir (karşılaştırma için kaynak penceremiz yoktur).


Yalnızca iş parçacığı kimliği gereklidir, çünkü İki terminalim var.

Başlık tanımlamasından çıktım, ancak yine de test cihazının altından iş parçacığı kimliğini nasıl belirleyeceğimi bilmek ister miyim?

Neden: