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

 
DKeN:

你能告诉我如何抓住由F9(命令)调用的窗口吗?

靠文字找不到。

到目前为止,它被抓到的情况如下。

在我看来,这根本就不是一个可靠的方法。当订单窗口打开时,尝试打开一些其他窗口,例如图表属性,或终端设置,或全局变量,等等。GetLastActivePopup会向你显示什么窗口?
 

你好!

你能告诉我如何从测试器中运行的EA中确定MT描述符吗?

的构造。

int hMetaTrader = GetAncestor(WindowHandle(Symbol(),Period()),2);              // Дескриптор основного окна терминала
不起作用,因为
WindowHandle(Symbol(),Period())

返回0。

 

在这个时候,这样的图表是否开放?(用指定的符号和句号)

 
Meat:

在这个时候,这样的图表是否开放?(带指定符号和句号)

是的,当然了。

两种方式都试过了。

还是说这是WindowHandle函数的一个特性(虽然在帮助中没有提到它......)。

或者,也许我是哑巴...

 
lasso:

是的,当然了。

两种方式都试过了。

或者是WindowHandle函数的特殊性(虽然帮助中没有提到...)。

或者,也许我是哑巴...

在可视化模式下,手柄的工作没有任何问题。而且你可能不是在视觉模式下进行测试。那么就有意义了:没有窗口,就没有把手。至于其他打开的窗口,根据我的理解,它们是无法从测试者那里获得的。
在这种情况下,唯一的出路是使用FindWindowExA(...)在所有窗口的列表中搜索Metatrader窗口。
 
Meat:

在可视化模式下,获得手柄没有任何问题。但你必须是在非视觉模式下进行测试。那么就有意义了:没有窗口,就没有把手。至于其他打开的窗口,我理解它们是无法从测试者那里获得的。
在这种情况下,唯一的出路是使用FindWindowExA(...)在所有窗口的列表中搜索所需的窗口。

是的,我试着应用第5页Ilnur 的代码。


伊尔努尔

下面是一个启动策略测试器并等待其完成的脚本的例子。用GetWindowTextA() 读取按钮文本。

有趣的是,在这种情况下,测试器窗口不一定要可见。

但从测试者来看,这一招并不奏效。 (我正在启动另一个终端,从测试者那里进行优化,并希望跟踪这一过程的完成情况)。

如果不是太困难的话,你能给我一个FindWindowExA(...)的例子或一个链接吗?

 

我这里有这样一个寻找窗口的函数。

#import "user32.dll"
  int FindWindowExA(int hwndParent,int hwndChildAfter, string lpClassName, string lpWindowName);       
  int GetWindowThreadProcessId(int hWnd,int lpdwProcessId);
  int GetWindowTextA(int hWnd,string lpString,int nMaxCount);
#import

//инициализируем текстовый буффер длиной 128 байт. Вообще должен быть 255 байт! Но он не влезает на экран, из-за чего окно форума сильно растягивается :)
string textbuf="АбвгдежзийклмнопрстуфхцчшщъыьэюяАбвгдежзийклмнопрстуфхцчшщъыьэюяАбвгдежзийклмнопрстуфхцчшщъыьэюяАбвгдежзийклмнопрстуфхцчшщъыьэюя";

int FindWindow(string class, string caption, bool captionexactly=false)
{    
  //int CurrentThreadID=GetWindowThreadProcessId(WindowHandle(Symbol(),Period()),0);
  string null_string;
  int h=0;
  while(true)
  {    
    if (captionexactly)
      h=FindWindowExA(0,h,class,caption);
     else
      h=FindWindowExA(0,h,class,null_string);
    if (h==0) return(0);
    //if (GetWindowThreadProcessId(h,0)!=CurrentThreadID) continue;
    if (captionexactly) return(h);
    int len=StringLen(caption);
    if (GetWindowTextA(h,textbuf,128)<len) continue;
    if (StringSubstr(textbuf,0,len)==caption) return(h);  
  }
  return(0);
}
 

在SPY++中查找所需窗口的类名和标题。

我注释了线程ID检查,因为在这种情况下不需要(没有源窗口可以比较)。

一般来说,我建议你处理WinAPI函数,如果你要使用它们的话。请参考MSDN(http://msdn.microsoft.com/en-us/library/ff818516.aspx)的详细功能描述。

 
cm=GetDlgItem(hdlg,ID_SYMBOL)。
int pos=SendMessageA(cm,CB_GETCOUNT,0,0);//获取列表中的数字。
//找到这一对
string fs=";
for(int l=0;l<pos;l++){
int ll=SendMessageA(cm,CB_GETLBTEXT,l,fs)。
打印(ll," ",fs)。
}

请教如何正确地在订单窗口(F9)中获得工具清单?

我得到了元素的数量,但不能准确地得到行的数量,返回-1。

#define ID_SYMBOL 0x053E //要选择的字符名称

cmhandle ComboBox


 
Meat:

在这里我有这样的功能,用于窗口搜索。


阿列克谢,谢谢,该功能可以使用,但...
肉类

我已经注释了流量ID检查,因为在这种情况下不需要(我们没有源窗口可以比较)。


只需要螺纹ID,因为我有两个终端参与。

我通过头的识别摆脱了它,但我仍然想知道如何从测试器下面确定流量ID?