Fehler, Irrtümer, Fragen - Seite 2523

 
Sergey Dzyublik:

Es funktionierte mit WM_CONTEXTMENU.
Ich habe den Code leicht verändert, so dass er leichter zu debuggen ist und wiederverwendet werden kann:

Vielen Dank, das Menü erscheint!

Sie wissen nicht, wie Sie einen Menüpunkt auswählen können. Ich habe WM_ENTERIDLE und MN_GETHMENU ausprobiert, ohne Erfolg.

Ist die Auswahl eines bestimmten Menüpunkts nicht selbst ein interner MT5-Befehl?


ZZY Diese Option hat nicht funktioniert.

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

Ist die Auswahl eines bestimmten Menüpunkts nicht selbst eine Art interner MT5-Befehl?

Ja, das wurde am Anfang angedeutet, aber die internen Befehle scheinen ohne registermessage nicht zu funktionieren.
 
TheXpert:
Ja, das wurde am Anfang angedeutet, aber die internen Befehle scheinen ohne registermessage nicht zu funktionieren.

Jeder weiß, wie man ein Register für MT4 erstellt. Aber MT5...

 
fxsaber:

Jeder weiß, wie man ein Register für MT4 erstellt. Aber MT5...

Ja.
 
Ich habe versucht, die Ideen aus diesem Quellenbuch zu verwenden, aber es hat wieder nicht geklappt!
  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:
Ich habe versucht, die Ideen aus diesem Quellenbuch zu verwenden, aber es hat wieder nicht geklappt!


#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:
Ich habe versucht, die Ideen aus diesem Quellcode zu verwenden, und bin wieder gescheitert !

Es scheint das Drücken der Tastaturpfeile und das Klicken auf das Menü zu simulieren:

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

Danke, ich habe es verstanden. Das Programm menuspy, das ich hier erhalten habe, war sehr hilfreich.

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

Ich habe auf eine bestimmte Formulierung reagiert. Beruhigen Sie sich. Nehmen Sie Baldrian und gehen Sie ins Bett, es ist nicht gut für Sie, sich Sorgen zu machen. ...Manche Leute werden heiß, wenn sie das Wort "C++" hören.

Ich habe nicht nur Ihnen geantwortet, falls Sie es nicht verstanden haben, und Ihr Satz ist ziemlich aufschlussreich... Ob ich besorgt bin oder nicht, entscheide ich selbst, ohne Ihre Beteiligung. Seien Sie also nicht unhöflich und trinken Sie Baldrian, Sie werden nicht mögen, was ich zu sagen habe.

Jeder, der sich für die Unterschiede zwischen MQL und C++ interessiert, empört oder verblüfft ist, sollte ein eigenes Thema erstellen und dort alles alleine diskutieren. Oder kann ich helfen?

 
Pause, die heißen finnischen Jungs.