버튼 및 마우스 클릭을 가로채는 자동화. - 페이지 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 기능

설명:
함수 CheckDlgButton(Dlg: HWnd; IDButton: 정수; 검사: Word);

버튼 컨트롤을 표시 또는 해제하거나 3버튼 컨트롤의 상태를 변경합니다.

매개변수:
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: 정수; 검사: Word);

버튼 컨트롤을 표시 또는 해제하거나 3버튼 컨트롤의 상태를 변경합니다.

매개변수:
Dlg: 버튼을 포함하는 대화 블록.
IDButton: 수정 가능한 버튼 컨트롤입니다.

확인: 제거됨(0), 확인됨(1), 회색으로 표시됨(2).


실행하기 전에 버튼의 상태를 확인하는 함수. 제 경우에는 확인란에서.


라디오 버튼의 현재 상태를 확인하려면 IsDlgButtonChecked 함수를 사용할 수 있습니다.

 UINT WINAPI IsDlgButtonChecked(HWND hdlg, int idButton);

이 함수는 hdlg 대화 상자에 있는 idButton이 id인 라디오 버튼의 상태를 반환합니다. 스위치가 꺼진 상태이면 0이 반환됩니다. 활성화된 라디오 버튼에 대해 값 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 및 다른 사람들은 내가 필요한 요소에 대해 이 설명자 코드를 정의하는 방법을 가르쳐줍니다.



다른 요소를 스스로 결정하는 방법을 배우고 싶기 때문에 코드를 구체적으로 나타내지 않고 가르쳐달라고 요청하는 이유는 무엇입니까? 표시해 주시면 나중에 무엇을 찾아야 하는지, 어디에서 찾아야 하는지 알면 나중에 찾기가 더 쉬울 것 같지만....

 

여기 에서 "시작" 버튼의 ID를 결정하는 방법에 대한 코드 예제를 제공했습니다.

그림은 또한 제어 ID를 찾는 방법을 보여줍니다.

전략 테스터 창에 있는 모든 컨트롤은 동일한 방식으로 정의됩니다.

예를 들어, 위에 게시된 사진으로 판단하면 "최적화" 체크박스("일반" 탭)의 ID는 0x405입니다.

 
코드를 알아냈습니다. 2 버튼의 코드를 잡을 수없는 유일한 것은 "Date"에서 "Date"까지의 테스트 및 최적화 날짜입니다. 프로그램은 00000001을 표시합니다. Ilnur는 이 버튼의 코드를 알려줍니다.
 
HIDDEN >> :
코드를 알아냈습니다. 2 버튼의 코드를 잡을 수없는 유일한 것은 "Date"에서 "Date"까지의 테스트 및 최적화 날짜입니다. 프로그램은 00000001을 표시합니다. Ilnur는 이 버튼의 코드를 알려줍니다.

예, 실제로 이러한 요소의 식별자는 동일합니다. 따라서 이 경우 GetDlgItem() 함수를 사용할 수 없습니다.

남은 유일한 옵션은 FindWindowExA()를 사용하여 식별하는 것입니다. 그러나 주요 질문은 그것들을 정의할 필요가 있는지 여부입니다.

이러한 요소를 관리하는 능력, 즉. 최적화 또는 테스트 기간을 설정하면 MQL에 WinAPI가 없습니다.

내가 틀릴 수도 있지만.

 
Ilnur >> :

예, 실제로 이러한 요소의 식별자는 동일합니다. 따라서 이 경우 GetDlgItem() 함수를 사용할 수 없습니다.

남은 유일한 옵션은 FindWindowExA()를 사용하여 식별하는 것입니다. 그러나 주요 질문은 그것들을 정의할 필요가 있는지 여부입니다.

이러한 요소를 관리하는 능력, 즉. 최적화 또는 테스트 기간을 설정하면 MQL에 WinAPI가 없습니다.

내가 틀릴 수도 있지만.



예를 들어 ID가 0x0577인 요소 찾기(전문가 버튼 변경)

NextWindow 체인을 3번 클릭하면 날짜 From 필드로 이동합니다. 그런 다음 NextWindow를 두 번 더 살펴보고 날짜 To 필드로 이동합니다.

두 경우 모두 날짜 필드를 채우십시오.

SetWindowTextA( hwndEditDATEbeg, sDateBeg);

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

..

MSQL5에서 테스터와 통신하기 위한 일반 도구를 얻고 싶습니다...