错误、漏洞、问题 - 页 2523

 
Sergey Dzyublik:

它与WM_CONTEXTMENU一起工作。
稍微调整了一下代码,它更容易调试,可以重复使用。

谢谢你,菜单出现了!

困惑于如何选择一个菜单项目。尝试了WM_ENTERIDLE和MN_GETHMENU,没有成功。

选择某个菜单项本身不就是MT5的内部命令吗?


ZZY 这个选项没有作用。

  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与C++的差异感兴趣、愤怒、困惑的人--创建一个单独的主题,并在那里自行讨论这一切。或者我可以帮忙吗?

 
突破,火热的芬兰人。