Belki de düğmeden bir dize okumak ve ardından aynı kalıp kalmadığını veya değişip değişmediğini karşılaştırmak daha kolaydır? Çok sayıda dil var, ancak düğmenin yalnızca iki durumu var.
Stanislav Korotky #: Düğmeden bir dize okumak ve ardından aynı kalıp kalmadığını veya değişip değişmediğini karşılaştırmak daha kolay olmaz mıydı?
Sonuçta, işlev önceki durumlara bağlı olmamalıdır. Renk kullanmak daha kolay olurdu: yeşil - başla, aksi halde - dur. Ancak WinAPI'de her şeyi poke yöntemiyle yapıyorum, bu yüzden düğmenin rengini (Yeşil bileşen) nasıl okuyacağımı bilmiyorum. Çalışan bir varyant varsa, elbette değiştireceğim.
Yine de, işlev önceki durumlara bağlı olmamalıdır. Renk kullanmak daha kolay olurdu: yeşil - başla, aksi halde - dur. Ancak WinAPI'de her şeyi poke yöntemiyle yapıyorum, bu yüzden düğmenin rengini (Yeşil bileşen) nasıl okuyacağımı bilmiyorum. Çalışan bir varyant varsa, elbette değiştireceğim.
Bu kod benim tarafımdan test edildi ve çalıştığı onaylandı.
(Her iki yöntemi de saklamanızı tavsiye ederim, belki gelecekte MT5 geliştiricileri renkleri değiştirir).
//+------------------------------------------------------------------+//|CheckButtonColour.mq5|//+------------------------------------------------------------------+#include <WinAPI/winapi.mqh>
#define privatepublic#include <fxsaber/MultiTester/MTTester.mqh>
#undef private#ifdef __MQL5__#define ULONG_PTR ulong#else
#define ULONG_PTR uint#endif
#define WORD int#define DWORD_PTR ULONG_PTR
#define BYTE uchar#define LOBYTE(w) ((BYTE)(((DWORD_PTR)(w)) & 0xff))
#define GetRValue(rgb) (LOBYTE(rgb))
#define GetGValue(rgb) (LOBYTE(((WORD)(rgb)) >> 8))
#define GetBValue(rgb) (LOBYTE((rgb)>>16))
//+------------------------------------------------------------------+//| "Başlat" düğmesinin tutamacını al|//+------------------------------------------------------------------+long GetStartBtnHandle(void) {
staticconstint ControlID[] = {0xE81E, 0x804E, 0x2712, 0x4196};
staticconstlong Handle = MTTESTER::GetHandle(ControlID);
if(Handle <= 0) return0;
return Handle;
}
//+------------------------------------------------------------------+//| Genel renk algılama işlevi: Düğmenin belirli olup olmadığını kontrol edin |//| konum önceden ayarlanmış RGB rengiyle eşleşir |//+------------------------------------------------------------------+bool IsButtonBackgroundColor(HWND hButton, color targetClr) {
if(!hButton || !user32::IsWindow(hButton)) returnfalse;
// 1. Ekrandaki düğme konumunu al
RECT rect;
user32::GetWindowRect(hButton, rect);
// 2. Örnekleme noktası: Sol kenardan 20 piksel, dikey merkez (metinden kaçının)int targetX = rect.left + 20;
int targetY = rect.top + (rect.bottom - rect.top) / 2;
// 3. Ekran örneklemesi
HANDLE hdcScreen = user32::GetDC(NULL);
uint clr = gdi32::GetPixel(hdcScreen, targetX, targetY);
user32::ReleaseDC(NULL, hdcScreen);
if(clr == 0xFFFFFFFF) returnfalse;
return targetClr == clr;
}
//+------------------------------------------------------------------+//| Kod giriş noktası OnStart|//+------------------------------------------------------------------+voidOnStart() {
HWND hBtn = (HWND)GetStartBtnHandle();
if(hBtn == 0) return;
// --- Kullanıcı ihtiyaçlarına göre esnek çağrılar ---// Şunun için kontrol edin: Açık tema yeşili (156, 204, 101) hover:140, 188, 85bool isLightGreen = IsButtonBackgroundColor(hBtn, C'156, 204, 101') ||
IsButtonBackgroundColor(hBtn, C'140, 188, 85');
// Şunun için kontrol edin: Koyu tema yeşili (96, 96, 0) hover:80, 80, 0bool isDarkGreen = IsButtonBackgroundColor(hBtn, C'96, 96, 0') ||
IsButtonBackgroundColor(hBtn, C'80, 80, 0');
// Şunun için kontrol edin: Açık tema kırmızı (239, 154, 154) hover:223, 138, 138bool isLightRed = IsButtonBackgroundColor(hBtn, C'239, 154, 154') ||
IsButtonBackgroundColor(hBtn, C'223, 138, 138');
// Şunun için kontrol edin: Koyu tema kırmızı (112, 14, 19) hover:128, 30, 35bool isDarkRed = IsButtonBackgroundColor(hBtn, C'112, 14, 19') ||
IsButtonBackgroundColor(hBtn, C'128, 30, 35');
// İş mantığıif(isLightGreen || isDarkGreen) {
Print("Current button state: Green (Ready to start)");
} elseif(isLightRed || isDarkRed) {
Print("Current button state: Red (Running/Stopped)");
} else {
Print("Current button state: Other color/Unknown");
}
}
//+------------------------------------------------------------------+
Yine de, işlev önceki durumlara bağlı olmamalıdır. Renk kullanmak daha kolay olurdu: yeşil - başla, aksi halde - dur. Ancak WinAPI'de her şeyi poke yöntemiyle yapıyorum, bu yüzden düğmenin rengini (Yeşil bileşen) nasıl okuyacağımı bilmiyorum. Çalışan bir varyant varsa, elbette değiştireceğim.
Muhtemelen düğmenin renginden değil, Girişler listesinin durumundan (etkin/devre dışı) daha kolaydır.
hini #: Girişlerin durumunu nereden öğrenebilirim? Resmi bir API yok, bunu renklere ve metne göre belirlememiz gerekiyor.
Tüm MT5 dahili bileşenleri için resmi bir API yoktur - bunları MS Spy gibi yardımcı programlar aracılığıyla incelemeniz gerekir - şimdi multitester'da kullanılan kontrol tanımlayıcıları bu şekilde bulundu.
Girdilerin vahşi doğasına girmezseniz ve sadece zaten test edilmiş başlat düğmesini kullanırsanız, GetWindowLongW(hwnd, 0) çağrısının düğmenin mevcut rengini döndürmesi gerektiği görülüyor. Benimki yeşil olan için 0xD0B1DF10 döndürüyor. Yalnızca MQ stili düzeltmeye karar verirse, bu ayar ortadan kalkabilir. Bu yüzden Girişlerin etkinliğini kontrol etmek her halükarda daha güvenilirdir.
Kod yalnızca Rusça ve İngilizce dillerini kontrol eder
Birisi Başlat düğmesinin diğer dillerdeki adını verirse, onu kaynağa ekleyeceğim.
Çince için "Başlat" ve "Durdur" düğmelerinin metni aşağıdaki gibidir: "开始" ve "停止".
Güncellendi.
Düğmeden bir dize okumak ve ardından aynı kalıp kalmadığını veya değişip değişmediğini karşılaştırmak daha kolay olmaz mıydı?
Sonuçta, işlev önceki durumlara bağlı olmamalıdır. Renk kullanmak daha kolay olurdu: yeşil - başla, aksi halde - dur. Ancak WinAPI'de her şeyi poke yöntemiyle yapıyorum, bu yüzden düğmenin rengini (Yeşil bileşen) nasıl okuyacağımı bilmiyorum. Çalışan bir varyant varsa, elbette değiştireceğim.
Yine de, işlev önceki durumlara bağlı olmamalıdır. Renk kullanmak daha kolay olurdu: yeşil - başla, aksi halde - dur. Ancak WinAPI'de her şeyi poke yöntemiyle yapıyorum, bu yüzden düğmenin rengini (Yeşil bileşen) nasıl okuyacağımı bilmiyorum. Çalışan bir varyant varsa, elbette değiştireceğim.
Bu kod benim tarafımdan test edildi ve çalıştığı onaylandı.
(Her iki yöntemi de saklamanızı tavsiye ederim, belki gelecekte MT5 geliştiricileri renkleri değiştirir).
Yine de, işlev önceki durumlara bağlı olmamalıdır. Renk kullanmak daha kolay olurdu: yeşil - başla, aksi halde - dur. Ancak WinAPI'de her şeyi poke yöntemiyle yapıyorum, bu yüzden düğmenin rengini (Yeşil bileşen) nasıl okuyacağımı bilmiyorum. Çalışan bir varyant varsa, elbette değiştireceğim.
Muhtemelen düğmenin rengine göre değil, Girişler listesinin durumuna göre daha kolaydır - etkin/devre dışı.
Girişlerin durumunu nereden öğrenebilirim? Resmi bir API yok, bunu renklere ve metne göre belirlememiz gerekiyor.
Tüm MT5 dahili bileşenleri için resmi bir API yoktur - bunları MS Spy gibi yardımcı programlar aracılığıyla incelemeniz gerekir - şimdi multitester'da kullanılan kontrol tanımlayıcıları bu şekilde bulundu.
Girdilerin vahşi doğasına girmezseniz ve sadece zaten test edilmiş başlat düğmesini kullanırsanız, GetWindowLongW(hwnd, 0) çağrısının düğmenin mevcut rengini döndürmesi gerektiği görülüyor. Benimki yeşil olan için 0xD0B1DF10 döndürüyor. Yalnızca MQ stili düzeltmeye karar verirse, bu ayar ortadan kalkabilir. Bu yüzden Girişlerin etkinliğini kontrol etmek her halükarda daha güvenilirdir.
GetWindowLongW(hwnd, 0) çağrısı düğmenin geçerli rengini döndürmeli gibi görünüyor. Yeşil olan için 0xD0B1DF10 alıyorum.