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

 
DKeN:
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

在你接收任何文本之前,你必须首先准备一个足够大的缓冲区来接收文本。而你的fs线根本就没有长度。奇怪的是,你的终端没有因为这种混乱而崩溃。这就是为什么你需要事先用一个 足够长的字符串来 初始化fs。如果我们考虑一般情况,当收到的字符串长度可以是任何长度时,我们应该首先通过CB_GETLBTEXTLEN消息知道这个长度,从而知道需要什么缓冲区大小。
 
lasso:

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


只需要螺纹ID,因为我有两个终端在使用。

我通过标头识别摆脱了困境,但我仍然想知道如何从测试器下确定螺纹的ID?

当前线程的ID可以通过函数GetCurrentProcessId()获得。
 
Meat:
在接收任何文本之前,你必须首先准备一个足够大的缓冲区来接收文本.......

文字!!!。

当根据我的需要调整你的功能时

int FindWindow(string class, string caption, bool captionexactly=false)

遇到了这样一个事实:在函数层本地声明的字符串缓冲区textbuf,在第一次调用时只被初始化了一次。

然后表现为一个静态变量

string textbuf="Абвгдежзийклмнопрсту";   // В_ЭТОЙ_СТРОКЕ_255_СИМВОЛОВ
Print("textbuf после инициализации =",textbuf);
你是否愿意对这种情况作出评论?
 
lasso:

文字!!!。

当根据我的需要调整你的功能时

遇到了这样一个事实:在函数层本地声明的字符串缓冲区textbuf,在第一次调用时只被初始化了一次。

然后表现为一个静态变量。

你能对这种情况作出评论吗?

我明白你的意思。你是说缓冲区存储了从GetText获取的旧值。我记得这也曾让我感到惊讶。但这是一个MQL功能。在论坛的某个地方,开发人员说,所有在编译器级别定义的常量 字符串都被永久地保存在内存中的一个单独的地方,当离开函数时不会丢失(覆盖)。它们的地址最初是已知的,在程序运行期间不会改变。因此,当再次调用该函数时,当访问相同的常量字符串时,会从相同的地址获取。但我们有一个不同的文本在那里,是由GetText函数放置的。
同样,你可以只做Print("Abvgdezijklmnostu"),在那里得到一个不同的文本 :)所以,这不是关于textbuf变量,而是关于一个常量字符串。在编译时,所有的常量字符串都被检查并放入数据库,而且只有唯一的字符串。如果检测到相同的字符串,只为它们创建一个共同的数据库实例。因此,如果你在工作中弄乱了这个实例,那么从程序的任何地方调用这样一个字符串也会返回一个混乱的结果。

如果你不喜欢它,你可以用程序创建一个缓冲区。

string textbuf="";
for (int i=0; i<255; i++)
  textbuf=textbuf+" ";

那么就不会有这样的问题了。我不记得这样做是否可以。不过,你不会得到一个内存访问错误。你应该试一试。

 
Meat:
这样就不会出现这样的问题。但我现在不记得是否有可能这样做了。我想知道是否不会出现内存访问错误......试一试吧。

当我读到"255个字符不适合在屏幕上显示,破坏了论坛的外观 "时, 这样做了。

但这个选项没有用,API函数没有返回任何东西......因此我离开了你的变体。

......

无论如何,非常感谢你的另一个全面答复。

 
lasso:

当我读到"255个字符不适合在屏幕上显示,而且破坏了论坛的外观 "时, 这样做了。

但这个选项没有用,API函数没有返回任何东西......这就是为什么我离开了你的变体。

......

无论如何,非常感谢你的另一个全面答复。


我的荣幸。

据我所知,原因是在这种情况下,属于变量的原始文本缓冲区的引用没有传递给函数,而是传递给其副本,即在调用函数 之前创建的临时缓冲区。因此,即使函数改变了这个缓冲区中的文本,也没有任何影响,因为原来的缓冲区仍然没有变化。而当函数退出时,对临时缓冲区的引用就会丢失。我曾经因为这个问题在将字符串传入DLL时很纠结。但是有一个解决方案。你需要将字符串数组的一个元素 传入函数。在这种情况下,不创建中间缓冲区,函数得到对原始缓冲区的引用。

string buffer[1]={""};
for (int i=0; i<500; i++)
  buffer[0]=buffer[0]+" ";

GetWindowTextA(h,buffer[0],500);

这应该有效。

 
void SetSymbol(int hdlg,string symbol,int len){
   int cm=GetDlgItem(hdlg,ID_SYMBOL);
   int pos=SendMessageA(cm,CB_GETCOUNT,0,0);//получим количество в списке
   string fs,ff;
   
   for(int l=0;l<pos;l++){
       //SendMessageA(cm,CB_SETCURSEL,l,0);
       int len_text=SendMessageA(cm,CB_GETLBTEXTLEN,l,0);
       fs=" ";
       for(int m=0;m<len_text+1;m++) fs=StringConcatenate(fs," ");
       int ll=SendMessageA(cm,CB_GETLBTEXT,l,fs);
       Print(len_text," = ",fs); //пусто!!! длину получает.

          
       ff=StringSubstr(fs,0,len);
      // Print(symbol);
       if(ff==symbol) {
            SendMessageA(cm,CB_SETCURSEL,l,0);
            break;
       }
   }
}

我可以正常获得长度,但我无法获得文本 :-(

请解释如何正确地初始化字符串,总的来说,在没有外部dll的情况下,是否可以实现?

有必要在工具列表中找到一个符号并选择它。


 
DKeN:

我可以正常获得长度,但我无法获得文本 :-(

请解释如何正确地初始化字符串,总的来说,在没有外部dll的情况下,是否可以实现?

它是在工具列表中找到一个符号并选择它。

关于字符串的初始化,我刚刚在之前给lasso 同志的留言中解释过。你可以使用字符串数组中的一个元素,或者简单地用足够长度的常数来初始化字符串变量。在你的情况下,使用常数更容易,因为你事先知道结果字符串的大小不会超过78字节。

12个字节(仪器代号)+2个字节(逗号和空格)+64个字节(完整的仪器名称)。这是最可能的字符串长度。嗯,你可以四舍五入到80。

但如果你只是想在列表中选择一个特定的乐器,你不需要得到它的名字。你只需使用CB_SELESTRING信息。作为一个字符串参数,你只需要发送名称的初始部分("EURUSD,"),它就会自己从列表中找到并选择合适的项目。

 

近期的百万美元机器人API顾问。 它在终端本身吸引了很多有利可图的交易...:) 当一两个月后,一个新发现的百万富翁试图从经纪人那里提取他的利润时,他会发现没有一笔交易......但顾问的退款期已过...:))))))))

 

伙计们,请帮助我确定订单箱中买入/卖出按钮的手柄。我已经找到了订单箱的把手。

int chart_handle = WindowHandle(Symbol(), Period());
int MT_handle = GetAncestor(chart_handle, GA_ROOT); // GA_ROOT 2
PostMessageA(MT_handle, WM_KEYDOWN, VK_F9, 0); // открываем окошко Ордер
Sleep(1000); // Wait. This is important!
int Order_handle = GetLastActivePopup(MT_handle); // хэндл от Ордер-а

接下来我试图确定按钮的句柄(例如购买),但我得到的回应是0。

int Buy_handle = GetDlgItem(Order_handle, 0x40C); // 0x40C найдено с помощью WinSpy++

最有趣的是,我在立即执行 框中找不到任何项目的手柄。我也找不到立即执行本身的句柄。尽管WinSpy++把它看作是一个独立的元素,并显示它的ID为0xFFFFFF。

请不要严格评判,我是个初学者。