Ошибки, баги, вопросы - страница 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

Все знают, как делать Register для MT4. Но MT5...

 
fxsaber:

Все знают, как делать Register для 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, горячие финские парни.
Причина обращения: