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

 
HIDDEN >> :

面白い窓を発見。その中で何かをキャッチすることは、ほとんど不可能です。名前を付けて保存」というウィンドウが表示されます。保存」ボタンの押し方を教えてください。

特に保存ボタンを選択した場合は、ボタンコード00000001となります

しかし、このコードで呼び出しても何も起こりません。この名もなきウィンドウは何ですか?

ポップアップダイアログボックスです。そのシステムディスクリプタは、WinAPI関数GetLastActivePopup(int hWnd)で取得することができます。

以下に、この機能の使用例を示します。

#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);  //нажимаем на кнопку
}
 

チェックボックスがない場合は、プログラムによりチェックを入れることができます。

そのために使用されるWin API関数を教えてください。

 

WinAPIに関数を発見。


CheckDlgButton機能

説明:
function CheckDlgButton(Dlg: HWnd; IDButton: Integer; Check: Word)。

ボタンコントロールにマークを付けたり外したり、3ボタンコントロールの状態を変更します。

Parameters:
Dlg: ボタンが含まれるダイアログボックス。
IDButton: ボタンの変更可能なコントロール。

チェック項目:削除(0)、マーク(1)、網掛け(2)。


実行する前に、ボタンの 状態を確認する機能はどれですか?私の場合はチェックボックスの中に入っています。

 
Ilnur >> :



APIをテーマにした

保存するとき - もしこれが再び起こるなら、疑問が生じます!

セーブ・アズ

( file exists replace )


自動的にYESとなる


#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に関数を発見。


CheckDlgButton機能

説明
function CheckDlgButton(Dlg: HWnd; IDButton: Integer; Check: Word);

ボタンコントロールにラベルを貼ったり、チェックを外したり、3ボタンコントロールの状態を変更したりします。

パラメータ
Dlg:ボタンを含むダイアログボックス。
IDButton: ボタンの変更可能なコントロール。

チェックした項目:削除(0)、マーク(1)、影付き(2)。


実行する前に、どの関数を使用してボタンの状態を確認するか。私の場合はチェックボックスで。


IsDlgButtonChecked関数で、スイッチの現在の状態を判断することができます。

UINT WINAPI IsDlgButtonChecked(HWND hdlg, int idButton);

この関数は、hdlgダイアログボックスにあるidButtonのスイッチの状態を返します。スイッチが無効状態の場合、NULL値を返す。スイッチがオンの場合、値1が返される。2は非アクティブなスイッチに相当し、グレーで表示されます。エラーの場合は、負の値である-1を返す。

---


IsDlgButtonCheckedの動作例はこちらでご覧いただけます。

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

 

WinAPIの勉強のテーマに戻ることにした。

Microsoft Spy++ v.9.00.21022 を使って、「最適化」チェックボックスの識別子を探し、チェックが入っているかどうかを確認しようとしています。

私は次のようなステップを踏んでいます。

1.端末を起動。

2.テスターウィンドウを開いた。


3.Spy++でウィンドウを探し、「Optimize」要素を指しました。


OKボタンをクリック。

4.次のウィンドウのタブを実行する


このボタンのコードがどこにあるのかわかりません。


Ilnurや YuraZなどは、私が必要とするこのディスクリプタコードを特定するために教えてくれて います。



なぜ教えを乞うかというと、具体的にコードを指し示すのではなく、他の要素を見極める力を身につけたいからです。とはいえ、指定しておけば、どこで何を探せばいいのかがわかって、後で探しやすいかもしれませんが......。

 

ここでは、「スタート」ボタンの識別子を求めるコード例を示しました。

同図は、コントロールの識別子を見つける方法を示しています。

ストラテジーテスターウィンドウにあるすべてのコントロールは、同じように定義されます。

例えば、上の図によると、「最適化」チェックボックス(「一般」タブ)の識別子は、0x405です。

 
コードの整理ができた。ただ、2つのボタンのコードが見つからないのは、テストと最適化の日付を「日付」から「年月日」にしていることです。プログラムは、00000001を出力します。イルナーは、これらのボタンのコードを教えてください。
 
HIDDEN >> :
整理してみました。ただ、テスト用の日付と「日付」から「日付」への最適化の2つのボタンのコードが見つからない。プログラム出力 00000001イルナーは、これらのボタンのコードを教えてください。

はい、確かに、これらのアイテムの識別子は同じです。したがって、この場合、GetDlgItem()を使用することはできません。

このため、FindWindowExA()を使って特定するオプションが残されています。しかし、本題は「特定する必要があるのか」ということです。

これらの項目は、MQLのWinAPIで最適化やテスト期間の指定などの管理をすることはできません。

間違っているかもしれませんが。

 
Ilnur >> :

はい、確かに、これらのアイテムの識別子は同じです。したがって、この場合、GetDlgItem()を使用することはできません。

このため、FindWindowExA()を使って特定するオプションが残されています。しかし、本題は「特定する必要があるのか」ということです。

これらの項目は、MQLのWinAPIによって最適化やテスト期間を指定するなど、管理できる可能性がありません。

でも、私が間違っているかもしれません。



ID - 0x0577 のアイテムを見つける(Change Expert ボタンをクリック)。

をクリックし、NextWindowを3回クリックすると、Fromの日付フィールドに入ります。次にNextWindowをさらに2回クリックすると、Toの日付フィールドに入ります。

どちらの場合も、日付フィールドを埋めるだけです。

SetWindowTextA( hwndEditDATEbeg, sDateBeg ) を実行します。

SendMessageA(hwndEditDATEbeg, EN_UPDATE, _ID_EDIT_HEX_DATEbeg, 0)を実行。
SendMessageA(hwndEditDATEbeg, EN_CHANGE, _ID_EDIT_HEX_DATEbeg, 0)を送信します。

..

MSQL5では、テスターとのコミュニケーションのためのツールをぜひ内蔵してもらいたいのですが...。