带有按钮和鼠标点击拦截的自动化。 - 页 7

 
HIDDEN >> :

发现一个有趣的窗口。几乎不可能在其中抓到任何东西。该窗口被称为 "另存为"。你能告诉我如何按下 "保存 "按钮吗?

如果你专门选择了保存按钮,你的按钮代码是0000000001

但用这段代码调用它时,什么也没有发生。这个未命名的窗口是什么?

这是一个弹出的对话框。它的系统描述符可以通过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);

标记或不标记一个按钮控制或改变一个三按钮控制的状态。

参数:
Dlg:包含按钮的对话框。
IDButton: 按钮的可修改控件。

检查:删除(0),标记(1),阴影(2)。


在执行它之前,哪个函数要检查按钮的状态。在我的情况下,它是在复选框中。

 
Ilnur >> :



延续API的主题

保存时--如果再发生这种情况,问题就会出现了!

保存为

( 文件存在替换 )


自动点击 "是"。


#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函数

描述。
功能 CheckDlgButton(Dlg: HWnd; IDButton: Integer; Check: Word)。

对一个按钮控件进行标记或取消标记,或改变一个三按钮控件的状态。

参数。
Dlg: 包含该按钮的对话框。
IDButton: 按钮的可修改控件。

检查:删除(0),标记(1),阴影(2)。


在执行它之前,用哪个函数来检查按钮的状态。在我的案例中,在复选框中。


你可以使用IsDlgButtonChecked函数来确定开关的当前状态。

UINT WINAPI IsDlgButtonChecked(HWND hdlg, int idButton);

该函数返回位于hdlg对话框中的idButton开关的状态。如果开关处于禁用状态,则返回一个空值。如果开关处于开启状态,则返回值为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++中,我搜索了一个窗口并指向 "优化 "元素。


点击了 "确定 "按钮。

4.在下一个窗口的标签中运行


我搞不清楚我的这个按钮的代码在哪里。


Ilnur YuraZ 和其他人教我识别这个我需要的描述符代码。



我为什么要求教你,而不是专门指向密码,因为我想学习识别其他元素。虽然如果你指定,我以后可能更容易找到它们,知道要找什么,在哪里找....。

 

这里 我给出了一个如何找到 "开始 "按钮标识符的代码例子。

同样的图显示了如何找到控件的标识符。

位于策略测试器窗口的所有控件都以同样的方式定义。

例如,根据上图,"优化 "复选框(常规标签)的标识符为0x405。

 
我已经把代码整理出来了。我唯一找不到这2个按钮的代码的是测试和优化的日期,从 "日期 "到 "日期"。程序输出000001。伊尔努尔告诉我这些按钮的代码。
 
HIDDEN >> :
我已经把它整理好了。我唯一找不到的是2个按钮的代码--测试的日期和从 "日期 "到 "日期 "的优化。程序输出 00000001。伊尔努尔告诉我这些按钮的代码。

是的,的确,这些项目的标识符是相同的。因此,在这种情况下,我们不能使用GetDlgItem()。

这就留下了使用FindWindowExA()识别它们的选项。然而,主要问题是我们是否需要识别它们。

不可能通过MQL的WinAPI来管理这些项目,即指定优化或测试期。

虽然我可能是错的。

 
Ilnur >> :

是的,的确,这些项目的标识符是相同的。因此,在这种情况下,我们不能使用GetDlgItem()。

这就留下了使用FindWindowExA()识别它们的选项。然而,主要问题是我们是否需要识别它们。

通过MQL中的WinAPI来管理这些项目,即指定优化或测试期的可能性是缺失的。

不过我可能是错的。



找到一个ID为0x0577的项目(点击改变专家按钮)。

点击 "下一个窗口 "3次,就可以进入 "开始 "日期字段:然后再尝试 "下一个窗口 "两次,我们就可以进入 "结束 "日期字段。

在这两种情况下,只需填写日期字段

SetWindowTextA( hwndEditDATEbeg, sDateBeg)。

SendMessageA(hwndEditDATEbeg, EN_UPDATE, _ID_EDIT_HEX_DATEbeg, 0)。
SendMessageA(hwndEditDATEbeg, EN_CHANGE, _ID_EDIT_HEX_DATEbeg, 0)。

..

在MSQL5中,我真的希望能有一个内置的工具来与测试人员沟通...