오류, 버그, 질문 - 페이지 2523

 
Sergey Dzyublik :

WM_CONTEXTMENU를 사용하여 성공하십시오.
코드를 약간 수정하면 디버그하기 쉽고 재사용할 수 있습니다.

감사합니다, 메뉴가 나타납니다!

메뉴 항목을 선택하는 방법에 대한 내 머리가 깨졌습니다. 가능한 모든 방법으로 WM_ENTERIDLE 및 MN_GETHMENU를 훈제하고 종료되지 않습니다.

특정 메뉴 항목을 선택하는 것 자체가 일종의 내부 MT5 명령이 아닌가?


위협 이 옵션이 작동하지 않았습니다

   const long hwnd = GetMenu(handle);
  PRINT64(hwnd);
  PRINT64(user32::SendMessageW(hwnd, WM_KEYDOWN, VK_DOWN, 0 ));
 
fxsaber :

특정 메뉴 항목을 선택하는 것 자체가 일종의 내부 MT5 명령이 아닐까요?

네, 처음에 힌트였습니다. 그러나 내부 명령은 registermessage 없이는 작동하지 않는 것 같습니다
 
TheXpert :
네, 처음에 힌트였습니다. 그러나 내부 명령은 registermessage 없이는 작동하지 않는 것 같습니다

누구나 MT4에 등록하는 방법을 알고 있습니다. 하지만 MT5...

 
fxsaber :

누구나 MT4에 등록하는 방법을 알고 있습니다. 하지만 MT5...

네.
 
이 소스 의 아이디어를 사용하려고 했으나 다시 작동하지 않았습니다 !
   string nullstring;
   const long hpopup=FindWindowW( "#32768" , nullstring);

#define MN_GETHMENU     0x01E1   
   const long hmenu = SendMessageW(hpopup, MN_GETHMENU, 0 , 0 );
  
   uint id=GetMenuItemID(hmenu, 0 );
#define WM_COMMAND                     0x0111
  SendMessageW(RootHandle,WM_COMMAND,id, 0 );
 
fxsaber :
이 소스 의 아이디어를 사용하려고 했으나 다시 작동하지 않았습니다 !


 #include <WinAPI\winuser.mqh>

#define GA_ROOT             0x00000002
#define WM_CONTEXTMENU     0x007B
#define MN_GETHMENU         0x01E1

#define TVM_GETITEM                  0x110C
#define TVM_GETNEXTITEM              0x110A


#define PRINT(x) ; Print ( #x, ":" , string (x))
#define PRINT64(x) ; printf ( "%s%s%#.08x" , #x, ":" , x)


long GetHandle( long handle, int &controls[]){
   long next_handle = handle;                                                                        
   for ( int i = 0 ; i < ArraySize (controls); i++){
      next_handle = user32::GetDlgItem(next_handle, controls[i]);
      PRINT64(next_handle);
   }           
   return next_handle;                
}
  

void OnStart (){
   long RootHandle = user32::GetAncestor(:: ChartGetInteger ( 0 , CHART_WINDOW_HANDLE ), GA_ROOT);
  PRINT64(RootHandle);  
  
   int controls[] = { 0xE81E , 0x804E , 0x28EF , 0x28FE }; 
   long handle = GetHandle(RootHandle, controls);
  PRINT64(handle);
  
   //PRINT(user32::SendMessageW(handle, WM_CONTEXTMENU, 0, -1));
  PRINT(user32::PostMessageW(handle, WM_CONTEXTMENU, 0 , - 1 ));
  PRINT( "Sleep" );
  
   Sleep ( 10 );
   long hwnd = FindWindowW( "#32768" , "" );
  PRINT64(hwnd);
  
   long menu_handle = SendMessageW(hwnd, MN_GETHMENU, 0 , 0 );
  PRINT(IsMenu(menu_handle));
  PRINT(GetMenuItemCount(menu_handle));
    
   long sub_menu_handle = GetSubMenu(menu_handle, 1 );   // 9
  PRINT(GetMenuItemCount(sub_menu_handle));            // 1
}
 
fxsaber :
이 소스 의 아이디어를 사용하려고 했으나 다시 작동하지 않았습니다 !

키보드 화살표를 누르고 메뉴에서 마우스를 클릭하는 시뮬레이션이 필요한 것 같습니다.

 #define WM_KEYDOWN                     0x0100
#define WM_KEYUP                       0x0101
#define WM_LBUTTONDOWN                 0x0201
#define WM_LBUTTONUP                   0x0202
#define VK_UP                           0x26
#define VK_DOWN                         0x28


//перемещение по меню (сколько пунктов, столько раз)
PostMessageW(handle, WM_KEYDOWN, VK_DOWN, 0 );
PostMessageW(handle, WM_KEYUP, VK_DOWN, 0 );

//нажатие пункта
SendMessageW(handle,WM_LBUTTONDOWN, 0 , 0 ); 
SendMessageW(handle,WM_LBUTTONUP, 0 , 0 );
 
Sergey Dzyublik :

감사합니다. 여기 에서 가져온 menuspy 프로그램이 많은 도움이 되었습니다.

Drafts by kero
  • wasm.in
(NB: некоторые порой потребуется запускать as admin, а то и as system) -WinDrag Однажды наткнулся на австралийский "The Customiser" by Wanga...
[삭제]  
Alexey Navoykov :

나는 특정 문구에 응답하고 있었다. 진정해. 발레리안을 마시고 잠자리에 드십시오. 걱정하는 것은 나쁩니다. ...하지만 어떤 사람들에게는 "C ++"라는 단어에 화상을 입습니다.)

그리고 나는 당신뿐만 아니라 당신이 이해하지 못했고 당신의 문구가 매우 드러났습니다 ... 걱정하는 것은 나에게 해롭습니다. 나는 당신의 참여없이 스스로 결정할 것입니다. 그러니 무례하게 굴지 말고 발레리안을 좀 마시십시오. 당신은 내가 하려는 말을 좋아하지 않을 것입니다.

MQL v С++의 차이점에 관심이 있고, 분노하고, 당혹스러워하는 모든 사람 - 별도의 주제를 만들고 좋은 측정을 위해 이 모든 것을 토론하십시오. 아니면 도와주세요?

 
Break , 뜨거운 핀란드 친구들.