버튼 및 마우스 클릭을 가로채는 자동화. - 페이지 10

 
DKeN :

F9(주문)로 호출되는 창을 잡는 방법을 알려주세요.

텍스트는 검색되지 않습니다.

지금까지 다음과 같이 잡았습니다.

나는 이것이 매우 신뢰할 수있는 방법이라고 생각하지 않습니다. 차트 속성, 터미널 설정 , 글로벌 변수 등과 같이 주문 창이 열려 있는 동안 다른 창을 열어 보십시오. GetLastActivePopup은 어떤 창을 제공합니까?
 

안녕하세요!

테스터에서 일하는 Expert Advisor로부터 MT 디스크립터를 결정하는 방법을 알려주시겠습니까?

설계:

 int hMetaTrader = GetAncestor ( WindowHandle ( Symbol ( ) , Period ( ) ) , 2 ) ;                // Дескриптор основного окна терминала
때문에 작동하지 않습니다
 WindowHandle ( Symbol ( ) , Period ( ) )

0을 반환합니다.

 

현재 일정이 열려 있습니까? (지정된 기호 및 마침표 포함)

 
Meat :

현재 일정이 열려 있습니까? (지정된 기호 및 마침표 포함)

그렇지.

이런 식으로 시도했습니다.

또는 WindowHandle 기능의 기능입니까 (도움말에는 이에 대한 단어가 없지만 ...)

아니면 내가 바보인가...

 
lasso :

그렇지.

이런 식으로 시도했습니다.

또는 WindowHandle 기능의 기능입니까 (도움말에는 이에 대한 단어가 없지만 ...)

아니면 내가 바보인가...

시각화 모드에서는 문제 없이 핸들을 얻습니다. 그리고 아마도 비주얼 모드에서 테스트하지 않을 것입니다. 그러면 모든 것이 논리적입니다. 창도 핸들도 없습니다. 열려 있는 나머지 창에 대해서는 내가 이해하는 한 테스터에서 사용할 수 없습니다.
이 경우 유일한 방법은 FindWindowExA(...)를 사용하여 모든 창 목록에서 Metatrader 창을 찾는 것입니다.
 
Meat :

시각화 모드에서는 문제 없이 핸들을 얻습니다. 그리고 아마도 비주얼 모드에서 테스트하지 않을 것입니다. 그러면 모든 것이 논리적입니다. 창도 핸들도 없습니다. 다른 열린 창은 내가 알기로 테스터에서 사용할 수 없습니다.
이 경우 유일한 방법은 FindWindowExA(...)를 사용하여 모든 창 목록에서 원하는 창을 검색하는 것입니다.

예, 다섯 번째 페이지Ilnur 'ac 코드를 적용해 보았습니다.


일누르 :

다음은 전략 테스터를 시작하고 완료될 때까지 기다리는 스크립트의 예입니다. 버튼 텍스트는 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);//목록의 금액 가져오기
//쌍 찾기
문자열 fs="";
for(int l=0;l<pos;l++){
int ll=SendMessageA(cm,CB_GETLBTEXT,l,fs);
인쇄 (ll," ",fs);
}

주문 창(F9)에서 악기 목록을 가져오는 방법을 알려주세요.

요소 수를 얻었지만 숫자로 행을 정확히 가져올 수 없으며 -1을 반환합니다.

#define ID_SYMBOL 0x053E //선택할 기호 이름

cm 핸들 콤보박스


 
Meat :

내 창 검색 기능은 다음과 같습니다.


Alexey, 덕분에 기능이 작동하지만 ..
고기 :

스레드 ID 확인을 주석 처리했기 때문에 이 경우 필요하지 않습니다(비교를 위한 소스 창이 없습니다).


스레드 ID만 필요합니다. 두 개의 터미널이 있습니다.

헤더 식별을 통해 빠져나왔지만 테스터 아래에서 스레드 ID를 확인하는 방법을 여전히 알고 싶습니다.