ボタンやマウスクリックの傍受による自動化。 - ページ 8

 

あとは、よく言われるように、2、3の事件を解決するのみです。

このWinAPIはプロ向けではありません。 私は今回初めて扱いました。


2つのことにこだわっています。


1.Expert Advisorのリストが 表示されているExpert Advisor ComboBoxから、行番号を名前で取得するにはどうしたらいいですか?


私はこうしています。


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

ゼロを得る、それだけです。InqSoft Windows Scannerというプログラムで同じことをすると、その行の番号が返されます。


それから、関数


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

すべて正常に動作するのですが、この12という数字をどうすれば出せるのかがわかりません。


2.これは、日付を挿入する際の問題です。YuraZさん、説明されたようですが、説明されたことにどうアプローチすればいいのかがわかりません。クリッカーもどうすればいいかわからない。


私は自動化されたオプティマイザを実行して終了するのに役立ちます、私は私にコードを送信することを約束し、私はエキスパート-アドバイザで保存されたHTMLと結果の置換の解析を添付したいと思います。後者は問題なし、テスターの立ち上げが面倒。チェックボックスを必要な場所に配置する方法、ボタンをクリックする方法を学びましたが、説明したことを使いこなせません。


完成とテストの後、私はそれを記事にしたいと思います、私は多くの人々にとってこの機能は有用であると思います、開発者がこの情報を見逃すという事実ではありませんが。

 
HIDDEN >> :

事新しく


行数を数えるまでもない

を検索すればよいのです。

論理的には、カウンタを作れば、リストから数字を上げることも可能です

いちばんうえをみてにげたり、いちばんしたをみてのぼったりする。

//+------------------------------------------------------------------+
//|                                                                  |
//|                                           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 >> :


ありがとうございます、さらに調べてみます。

 
HIDDEN >> :

あとは、よく言われるように、2、3の事件を解決するのみです。

このWinAPIは厄介で、プロ向けではありません。

コードは正しいので、動作するはずです。このコードは問題なく動作しています。

エラーが発生した場合、この関数は通常ゼロではなく、-1を返します。コードに何らかの誤りがあるのかもしれません。


もう一つの方法は、文字列を検索するSendMessageA()関数の宣言が正しいかどうかを確認することです。

最後のパラメータは文字列として宣言する必要があります。デフォルトで整数のままにしておくと、コンパイラが

はエラーなしでコードを飲み込みますが、関数は正しく動作しません。

 
Ilnur >> :

コードは正しいので、動作するはずです。このコードは問題なく動作しています。

エラーが発生した場合、この関数は通常ゼロではなく、-1を返します。コードに何らかの誤りがあるのかもしれません。


あるいは、SendMessageA()関数の宣言が正しく、文字列を検索していることを確認する必要があります。

最後のパラメータは文字列として宣言する必要があります。デフォルトで整数のままにしておくと、コンパイラが

は、エラーなしでコードを飲み込みますが、関数は正しく動作しません。

私のコードをターミナルで試してみてください。私のターミナルかライブラリがおかしくなっているのかもしれません。

 

私のエキスパート選択コードは、あなたと同じです。

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

ここで、sExpertNameはExpert Advisorの名前を文字列で表したものです。


実験の純度を高めるために、あなたのコードを実行しました。

 
Ilnur >> :

私のエキスパート選択コードは、あなたと同じです。

ここで、sExpertNameはExpert Advisorの名前を文字列で表したものです。


実験の純度を高めるために、あなたのコードを実行しました。

不思議なものですね...。というのは、私には効き目がないのです。

Windowsの種類とサービスパックを教えてください。

 

私のパソコンとネットでuser32.dllのライブラリファイルを見ると、大きさの違う ファイルがたくさんあります。

私の問題は、図書館そのものが曲がっていることなのかもしれません。


Ilnur、もしあなたのライブラリのバージョンをここに掲載するのが難しいのでなければ、私はそれでテストしてみます。

Yuraz、そして、あなたはIlnurのコードまたは私によって関数名を見つけ、置き換えることができた、あまりにもあなたのライブラリを投稿することが困難でない場合。

 
HIDDEN >> :

私のパソコンとネットでuser32.dllのライブラリファイルを見ると、大きさの違うファイルがたくさんあります。

私の問題は、図書館そのものが曲がっていることなのかもしれません。


Ilnurさん、もしよろしければ、あなたのライブラリのバージョンをここに載せていただけませんか?

Yurazは、あなたが見つけて、コードIlnurまたは鉱山で関数名を置き換えることができた、あなたのライブラリに困難ではない場合にも公開します。

SP2 XPPRO

たくさんのソフトウェアがインストールされているマシンでは、何が起こっても不思議ではありません。

ターゲットOSが安定した、実績のある小さなタスク群であるか、あるいは

つまり、多くのプログラムが常に実行されているわけでもなく、多くのものがインストールされているわけでもない。

かわりない

ファイル:
user32.zip  301 kb