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

 
xeon >> :

良い端末でした : -)))

誰しもが持っている端末です。しかも、ある意味赤いボタンが入っている。

自分の頭を警棒で叩くのは自分だけでいい。:))

 

イルナー ボタンのテキストも何とか読み取ることができます。それをSpy++のプログラムが読み取る。



つまり、ボタンが「停止」に設定されている間は、次のアクションが実行されるのを待つというロジックです。

User32.dllから、ボタンのテキストを正しく引き出す関数を教えてください。



GetDlgItemText関数

説明
function GetDlgItemText(Dlg: HWnd; IDDlgItem: Integer; Str: PChar; MaxCount: Integer): Integer;
コントロールのテキストを読み取ります。
パラメータ
Dlg:ダイアログボックスの識別子です。
IDDlgItem: アイテムのID。
Str: テキストを受信するバッファ。
MaxCount: バッファーのサイズ。
戻り値です。
実際にコピーされた文字数。


#import "user32.dll"

文字列 GetDlgItemText (int hWnd, int IDDlgItem, string PChar, int MaxCount)。

#インポート


機能の接続は正しいですか?


ターミナルでログに表示されるから

2008.11.15 21:03:41 tester EURUSD,H1: 関数 'GetDlgItemText' を dll 'user32.dll' から呼び出すことができません (エラー 127)。

 
xeon >> :

良い端末でしたね : -)))

Xeon、お前が元凶だろうが...。

私自身はそのステップには進まなかっただろうが...。が、その必要はないのだが......。

 
HIDDEN >> :

. . .

#import "user32.dll"

文字列 GetDlgItemText (int hWnd, int IDDlgItem, string PChar, int MaxCount)。

#インポート


機能の接続は正しいですか?


ターミナルでログに表示されるから

2008.11.15 21:03:41 tester EURUSD,H1: 関数 'GetDlgItemText' を dll 'user32.dll' から呼び出すことができません (エラー 127)。

どちらかというと、このような感じです。. .
#import "user32.dll"
   int GetDlgItemTextA(int hWnd, int IDDlgItem, string PChar, int MaxCount);
#import
 
Ilnur >> :
>>こういった感じです。. .

これは整数を返しますが、ボタンのテキストが必要です。

 
HIDDEN >> :

これは整数の数値を返しますが、ボタンのテキストが必要です。

テキストは PChar 文字列バッファで返される。

この関数自体は、実際に読み取った文字数を返します。

 
HIDDEN >> :

イルナー ボタンのテキストも何とか読み取ることができます。それをSpy++のプログラムが読み取る。


以下は、ストラテジーテスターを起動し、その完了を待つスクリプトの例です。ボタンのテキストは、GetWindowTextA() を使って読み取ります。

興味深いことに、この場合、テスターウィンドウは必ずしも表示されている必要はありません。


#include <WinUser32.mqh>

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

void start()
{
   int hMetaTrader, hTerminal, hTester, hButtonStart;
      
   hMetaTrader = GetAncestor(WindowHandle(Symbol(),Period()),2); //дескриптор основного окна терминала
	
   hTerminal = GetDlgItem(hMetaTrader,0xE81E);
   hTester = GetDlgItem(hTerminal,0x53);
   hButtonStart = GetDlgItem(GetDlgItem(hTester,0x81BF),0x40A);  //дескриптор кнопки "Старт"
	
   PostMessageA(GetDlgItem(hTester,0x81BF),WM_COMMAND,0x40A,hButtonStart); //нажимаем кнопку старт
   
   Print("Запуск тестера стратегий");
   string sButtonStartName = "";
   while(!IsStopped()) 
   {
      Sleep(3000);
      GetWindowTextA(hButtonStart,sButtonStartName,6); //считываем текст кнопки запуска тестера
      if(sButtonStartName=="Старт")                    
      {
         Print("Работа тестера завершена");
         break;
      }
   }
}
 
Ilnur >> :

以下は、ストラテジーテスターを起動し、その完了を待つスクリプトの例です。ボタンのテキストは、GetWindowTextA() を使って読み取ります。

興味深いことに、テスターウィンドウは表示されている必要はありません。


ありがとうございました。せめて、これらの機能についての説明や、使い方の例を見るにはどうしたらいいでしょうか?ネットで探しまくっているが、あまり参考にならない。Win APIの良い本があるのでは?その機能が何をするものなのかがわかるだけの説明では、まだ十分ではありません。

 
HIDDEN >> :

ありがとうございました。せめて、これらの機能についての説明や、使い方の例を見るにはどうしたらいいでしょうか?ネットで探しまくっているが、あまり参考にならない。Win APIの良い本があるのでは?この機能が何をするものなのか、簡単な説明では不十分な場合があります。

WinAPI関数に関する情報は、すべてMSDNから得ています。私はこの方法で慣れています。

P.S. WinAPIの良い本は、残念ながら見たことがありません。

 
Ilnur >> :

WinAPI関数の情報は、すべてMSDNから得ています。私はもっと慣れている.


P.S. 残念ながら、WinAPIに関する良い本を見たことがありません。

マウスの第1ボタンで開くメニューは、どのように横取りされるのですか?ターミナルから他のプログラムに切り替えると、メニューが消えてしまい、どうしても捕捉できない。プログラムを停止する方法はありますか?