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

 
HIDDEN >> :

İlginç bir pencere buldum. İçinde bir şey yakalamak neredeyse imkansız. Pencerenin adı "Farklı kaydet". "Kaydet" düğmesine nasıl tıklanır

Özel olarak kaydet düğmesini seçerseniz, 0000001 buton koduna sahibiz.

Ancak bu kodu kullanarak ona erişirken hiçbir şey olmuyor. Bu isimsiz pencere nedir?

Bu bir açılır iletişim kutusudur. Sistem tanıtıcısı WinAPI işlevi GetLastActivePopup(int hWnd) kullanılarak elde edilebilir.

İşte bu işlevi kullanmanın bir örneği:

 #include <WinUser32.mqh>

#import "user32.dll"
   int GetAncestor ( int hWnd , int gaFlags ) ;
   int GetDlgItem ( int hDlg , int nIDDlgItem ) ;
   int GetLastActivePopup ( int hWnd ) ;
#import

void start ( )
{
   int hMetaTrader , hDlg , hButtonSave , hChart = WindowHandle ( Symbol ( ) , Period ( ) ) ;

   hMetaTrader = GetAncestor ( hChart , 2 ) ;          //дескриптор основного окна терминала
   PostMessageA ( hMetaTrader , WM_COMMAND , 57604 , 0 ) ; //вызываем окно сохранения
   Sleep ( 100 ) ;
   hDlg = GetLastActivePopup ( hMetaTrader ) ;       //получаем дескриптор всплывающего окна
   hButtonSave = GetDlgItem ( hDlg , 1 ) ;             //определяем дескриптор кнопки "Сохранить"
   PostMessageA ( hDlg , WM_ CO MMAND , 1 , hButtonSave ) ;  //нажимаем на кнопку
}
 

Ve onay kutularında, eğer orada değillerse, onay kutuları programlı olarak ayarlanabilir.

onlar. Bir onay işareti olup olmadığını kontrol edin, değilse, gerekirse koyun. Bu hangi Win API işlevleriyle yapılır?

 

WinAPI'de bir işlev bulundu:


CheckDlgButton Fonksiyonu

Tanım:
function CheckDlgButton(Dlg: HWnd; IDButton: Tamsayı; Kontrol: Word);

Bir düğme denetimini işaretler veya işaretini kaldırır ya da üç düğmeli denetimin durumunu değiştirir.

parametreler:
Dlg: Düğmeyi içeren iletişim bloğu.
IDButton: Değiştirilebilir düğme kontrolü.

Kontrol edin: kaldırıldı (0), kontrol edildi (1), grileştirildi (2).


Çalıştırmadan önce , düğmenin durumunu kontrol etmek için hangi işlev. Benim durumumda, onay kutusunda.

 
Ilnur >> :



API temasının devamında

kaydederken - bu tekrar olursa soru ortaya çıkar!

farklı kaydet

(dosya var değiştirin)


otomatik vuruş EVET


 #include <WinUser32.mqh>

#import "user32.dll"
   int GetAncestor ( int hWnd , int gaFlags ) ;
   int GetDlgItem ( int hDlg , int nIDDlgItem ) ;
   int GetLastActivePopup ( int hWnd ) ;
#import

void start ( )
{
   int hMetaTrader , hDlg , hButtonSave , hChart = WindowHandle ( Symbol ( ) , Period ( ) ) ;

   hMetaTrader = GetAncestor ( hChart , 2 ) ;            //дескриптор основного окна терминала
   PostMessageA ( hMetaTrader , WM_COMMAND , 57604 , 0 ) ; //вызываем окно сохранения
   Sleep ( 100 ) ;
   hDlg = GetLastActivePopup ( hMetaTrader ) ;        //получаем дескриптор всплывающего окна
   hButtonSave = GetDlgItem ( hDlg , 1 ) ;              //определяем дескриптор кнопки "Сохранить"

   PostMessageA ( hDlg , WM_COMMAND , 1 , hButtonSave ) ;    //нажимаем на кнопку ,
   Sleep ( 100 ) ;

// и тут может возникнуть еще один диалог ФАЙЛ СУЩЕСТВУЕТ  - сохранять ДА НЕТ
 
   int hDlg1 = GetLastActivePopup ( hMetaTrader ) ;        //  получаем дескриптор всплывающего окна СОХРАНЯТЬ ИЛИ НЕТ
   int hButtonYES = GetDlgItem ( hDlg1 , 6 ) ;              //  определяем дескриптор кнопки  ДА  ID кнопки ДА он равен = 6
    PostMessageA ( hDlg1 , WM_COMMAND , 6 , hButtonYES ) ;    // мы подтверждаем ДА


}
 
HIDDEN >> :

WinAPI'de bir işlev bulundu:


CheckDlgButton Fonksiyonu

Tanım:
function CheckDlgButton(Dlg: HWnd; IDButton: Tamsayı; Kontrol: Word);

Bir düğme denetimini işaretler veya işaretini kaldırır ya da üç düğmeli denetimin durumunu değiştirir.

parametreler:
Dlg: Düğmeyi içeren iletişim bloğu.
IDButton: Değiştirilebilir düğme kontrolü.

Kontrol edin: kaldırıldı (0), kontrol edildi (1), grileştirildi (2).


Çalıştırmadan önce, düğmenin durumunu kontrol etmek için hangi işlev. Benim durumumda, onay kutusunda.


Bir radyo düğmesinin mevcut durumunu belirlemek için IsDlgButtonChecked işlevini kullanabilirsiniz:

 UINT WINAPI IsDlgButtonChecked(HWND hdlg, int idButton);

Bu işlev, hdlg iletişim kutusunda bulunan idButton kimliğine sahip radyo düğmesinin durumunu döndürür. Anahtar kapalı durumdaysa, sıfır döndürülür. Etkinleştirilmiş bir radyo düğmesi için 1 değeri döndürülür.2 değeri, gri renkle gösterilen etkin olmayan bir radyo düğmesine karşılık gelir. Hata durumunda, negatif bir -1 değeri döndürülür.

---


IsDlgButtonChecked'in nasıl çalıştığına dair bir örnek burada bulunabilir

http://frolov-lib.ru/books/bsp/v12/ch3_2.htm

 

WinAPI öğrenme konusuna dönmeye karar verdim.

Microsoft Spy++ v.9.00.21022 kullanarak, programlı olarak işaretlenip işaretlenmediğini kontrol etmek için "Optimizasyon" onay kutusunun tanımlayıcısını bulmaya çalışıyorum.

Aşağıdaki işlemleri adım adım yapıyorum.

1. Terminali başlattı.

2. Test penceresi açıldı.


3. Spy++ programında pencere aramasını aradım ve "Optimizasyon" öğesini hedefledim


tamam düğmesine bastı.

4. Bir sonraki pencerenin sekmelerinden geçiyorum


Ve bu düğme için istediğim kodun nerede olduğunu anlayamıyorum.


Ilnur , YuraZ ve diğerleri bana ihtiyacım olan element için bu tanımlayıcı kodu nasıl tanımlayacağımı öğretiyor.



Neden kodları özellikle belirtmeden öğretmenizi istiyorum, çünkü diğer unsurları kendim nasıl belirleyeceğimi öğrenmek istiyorum. Belirtirseniz, belki de neyi arayacağımı ve nereye bakacağımı bilerek onları daha sonra bulmam daha kolay olacaktır ....

 

Burada "Start" butonunun ID'sinin nasıl belirleneceği konusunda bir kod örneği verdim.

Şekil ayrıca kontrol kimliğinin nasıl bulunacağını da gösterir.

Strateji tester penceresinde yer alan tüm kontroller aynı şekilde tanımlanır.

Örneğin, yukarıda yayınlanan resme bakılırsa, "Optimizasyon" onay kutusunun ("Genel" sekmesi) kimliği 0x405'tir.

 
Kodları çözdüm. 2 düğmenin kodlarını yakalayamadığım tek şey "Tarih"ten "Tarih"e kadar olan test ve optimizasyon tarihleri. Program 00000001 gösteriyor. İlnur bana bu düğmelerin kodlarını söyle.
 
HIDDEN >> :
Kodları çözdüm. 2 düğmenin kodlarını yakalayamadığım tek şey "Tarih"ten "Tarih"e kadar olan test ve optimizasyon tarihleri. Program 00000001 gösteriyor. İlnur bana bu düğmelerin kodlarını söyle.

Evet, gerçekten de bu öğelerin tanımlayıcıları aynıdır. Bu nedenle, bu durumda GetDlgItem() işlevini kullanmak mümkün değildir.

Geriye kalan tek seçenek, onları FindWindowExA() kullanarak tanımlamaktır. Ancak asıl soru, bunları tanımlamaya gerek olup olmadığıdır.

Bu unsurları yönetme yeteneği, yani. optimizasyon veya test periyodunu ayarlayın, MQL'de WinAPI yoktur.

Her ne kadar yanılıyor olsam da.

 
Ilnur >> :

Evet, gerçekten de bu öğelerin tanımlayıcıları aynıdır. Bu nedenle, bu durumda GetDlgItem() işlevini kullanmak mümkün değildir.

Geriye kalan tek seçenek, onları FindWindowExA() kullanarak tanımlamaktır. Ancak asıl soru, bunları tanımlamaya gerek olup olmadığıdır.

Bu unsurları yönetme yeteneği, yani. optimizasyon veya test periyodunu ayarlayın, MQL'de WinAPI yoktur.

Her ne kadar yanılıyor olsam da.



örneğin ID - 0x0577 (uzman değiştir düğmesi) ile öğeyi bulun

ve NextWindow zincirine 3 kez tıklayın, sadece date From alanına giriyoruz: sonra NextWindow'dan iki kez daha geçiyoruz ve date To alanındayız:

her iki durumda da tarih alanlarını doldurmanız yeterli

SetWindowTextA( hwndEditDATEbeg, sDateBeg);

SendMessageA(hwndEditDATEbeg, EN_UPDATE, _ID_EDIT_HEX_DATEbeg, 0);
SendMessageA(hwndEditDATEbeg, EN_CHANGE, _ID_EDIT_HEX_DATEbeg, 0);

..

MSQL5'te, test cihazıyla iletişim kurmak için gerçekten düzenli bir araç almak istiyorum...

Neden: