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

 

Dedikleri gibi, birkaç vakayı çözmek için biraz kalıyor.

Beyler yardım edin, bu zor WinAPI profesyoneller için değil. onunla ilk kez çalışıyorum.


2 şeye takıldım.


1. Expert Advisors listesinin bulunduğu ComboBox'tan Expert Advisor'ın adına göre satır numarası nasıl döndürülür?


ben böyle yapıyorum


 #define CB_FINDSTRING 0x014C
#define CB_SETCURSEL  0x014E

hMetaTrader = GetAncestor ( WindowHandle ( Symbol ( ) , Period ( ) ) , 2 ) ;                // Дескриптор основного окна терминала
hTerminal = GetDlgItem ( hMetaTrader , 0xE81E ) ;                                  // Дескриптор окна валютной пары
hTester = GetDlgItem ( hTerminal , 0x53 ) ;                                        // Дескриптор окна тестера стратегий
ExpertsComboBox = GetDlgItem ( GetDlgItem ( hTester , 0x81BF ) , 0x468 ) ;              // Дескриптов списка экспертов

int exep = SendMessageA ( ExpertsComboBox , 0x014C , 0 , "Test_Expert" ) ;
Print ( "Строка № " , exep ) ;

Sıfır döndürür ve bu kadar. Aynı şeyi InqSoft programında yapmama rağmen Windows Scaner satır numarasını döndürüyor.


Sonra işlevi kullanıyorum


SendMessageA(ExpertsComboBox, 0x014E, 12, 0);                              // Установка эксперта

Her şey olması gerektiği gibi çalışıyor ama bu 12 sayısını nasıl elde edeceğimi henüz bilmiyorum.


2. Bu, tarihin yapıştırılmasıyla ilgili bir sorundur. YuraZ, biraz açıklamışsınız ama anlattıklarınıza nasıl yaklaşacağımı anlamıyorum. Bir tıklama ile de, hala nasıl yapacağım hakkında hiçbir fikrim yok.


Beyler, otomatik optimize edicinin başlatılmasını tamamlamama yardım edin, iş kodunu göndereceğime söz veriyorum, sonra kaydedilen HTML'nin ayrıştırılmasını ve sonuçların uzmana değiştirilmesini hızlandırmak istiyorum. İkincisi ile ilgili herhangi bir sorun yok, ancak bu test cihazının piyasaya sürülmesi zaten yıpranmış durumda. Küçük kargaları doğru yerlere koymayı, düğme dürtmeyi öğrendim ama anlattıklarımı kazanamıyorum.


Bitirip kontrol ettikten sonra, her şeyi bir makale şeklinde düzenlemek istiyorum, geliştiricilerin bu bilgiyi kaçıracağı bir gerçek olmasa da, çoğu kişi için bu işlevin faydalı olacağını düşünüyorum.

 
HIDDEN >> :

bir seçenek olarak


kaç satır olduğunu veya hala bir şekilde acı çektiğini saymamalısın

listede uzman "kahraman uzmanımız"ı aramanız yeterli

mantıksal olarak, bir sayaç yaparsanız, sayıyı listeden de yükseltebilirsiniz.

sadece listenin en üstünü bulup aşağı inmeniz veya altını bulup koşmanız gerekir

 //+------------------------------------------------------------------+
//|                                                                  |
//|                                           YURAZ Copyright © 2008 |
//|                         www.mail.ru yzh@mail.ru yyuraz@gmail.com |
//+------------------------------------------------------------------+
#property copyright "YURAZ Copyright © 2008"
#property link       "www.mail.ru yzh@mail.ru yyuraz@gmail.com"
#include <WinUser32.mqh>
//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start ( )
   {
//----
   
#define CB_FINDSTRING 0x014C
#define CB_SETCURSEL   0x014E

int hMetaTrader = GetAncestor ( WindowHandle ( Symbol ( ) , Period ( ) ) , 2 ) ;                // Дескриптор основного окна терминала
int hTerminal = GetDlgItem ( hMetaTrader , 0xE81E ) ;                                  // Дескриптор окна валютной пары
int hTester = GetDlgItem ( hTerminal , 0x53 ) ;                                        // Дескриптор окна тестера стратегий
int ExpertsComboBox = GetDlgItem ( GetDlgItem ( hTester , 0x81BF ) , 0x468 ) ;              // Дескриптов списка экспертов



/// ищем нашего героя условие мы должны стоять на первом в списке
{ 

  string p1 =    "012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234" ;

  GetWindowTextA ( ExpertsComboBox , p1 , 250 ) ;
 

   
  
   Print ( "Имя текущего эксперта " , p1     ) ;
 // можно в цикле пощелкать и найти 
  if ( p1 != "имя нашего героя")
      PostMessageA (ExpertsComboBox, WM_KEYDOWN,VK_DOWN, 0); // Сместились на нужную строчку.
  esle
     // break from  
 }
 
//   если последний толчок клавиши выдает то же самое имя - тормозим цикл
//  это все на уровни идеи описал..  обрисуйте как Вам надо сами
//  ну в смысле текст оформите сами...
//  учтите что если по умолчанию вы стоите в конце списка или в середине ... то логично пробежать список вверх
// а потом вниз   


    return ( 0 ) ;
   }
 
 
// прощелкать объекты

// ищем объект по имени 
int FindHendlMessage( 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);
}

// тут рекурсия - стек должен быть с запасом

//  вставить в начало - мне хватало 4048
#property stacksize   4048 // внимание это обязательно для рекурсии ( пока не замеченно косяков при стеке 4048

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);
}

 
YuraZ >> :


Teşekkürler, daha fazla inceleyeceğim.

 
HIDDEN >> :

Dedikleri gibi, birkaç vakayı çözmek için biraz kalıyor.

Beyler yardım edin, bu zor WinAPI profesyoneller için değil. onunla ilk kez çalışıyorum.

Kod doğru, bu yüzden çalışması gerekiyor. Bu kod bende sorunsuz çalışıyor.

Hata durumunda, işlev genellikle sıfır değil -1 döndürür. Belki kodda bir hata vardır.


Bir seçenek olarak, bir dize aramak için SendMessageA () işlevinin doğru bildirimini kontrol etmeniz gerekir.

Son parametre bir dize olarak bildirilmelidir. Varsayılan olarak tamsayı bırakılırsa, derleyici

kodu hatasız yutar, ancak işlev düzgün çalışmaz.

 
Ilnur >> :

Kod doğru, bu yüzden çalışması gerekiyor. Bu kod bende sorunsuz çalışıyor.

Hata durumunda, işlev genellikle sıfır değil -1 döndürür. Belki kodda bir hata vardır.


Bir seçenek olarak, bir dize aramak için SendMessageA () işlevinin doğru bildirimini kontrol etmeniz gerekir.

Son parametre bir dize olarak bildirilmelidir. Varsayılan olarak tamsayı bırakılırsa, derleyici

kodu hatasız yutar, ancak işlev düzgün çalışmaz.

Kodumu terminalinizde deneyin, belki terminalim veya kütüphaneli Windows sakardır.

 

Uzman seçim kodum sizinkiyle aynı:

hExpertBox = GetDlgItem(hTesterWnd, 0x468);
nPosition = SendMessageA(hExpertBox, CB_FINDSTRING, 0, sExpertName);
SendMessageA(hExpertBox, CB_SETCURSEL, nPosition, 0);

Burada sExpertName, bir dize olarak uzmanın adıdır.


Deneyin saflığı için kodunuzu çalıştırdım - her şey çalışıyor.

 
Ilnur >> :

Uzman seçim kodum sizinkiyle aynı:

Burada sExpertName, bir dize olarak uzmanın adıdır.


Deneyin saflığı için kodunuzu çalıştırdım - her şey çalışıyor.

Garip bir şey ... benim için çalışmıyor.

Hangi Windows maliyetleri ve hangi hizmet paketi?

 

Bilgisayarda ve ağda user32.dll kütüphane dosyasına baktım, farklı boyutlarda bir sürü 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.

 
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 ve sen İlnur'un kodlarına veya benimkine göre fonksiyon adını bulmayı ve değiştirmeyi başardın, zor değilse kütüphaneni de düzenle.

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

Dosyalar:
user32.zip  301 kb