エラー、バグ、質問 - ページ 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の内部コマンドのようなものではないのでしょうか?

しかし、内部コマンドはレジスタメッセージなしでは動作しないようです。
 
TheXpert:
しかし、内部コマンドはレジスタメッセージなしでは動作しないようです。

MT4のRegisterのやり方は誰でも知っている。でも、MT5は...。

 
fxsaber:

MT4のRegisterのやり方は誰でも知っている。でも、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:

ありがとうございます、わかりました。ここで 手にしたメンスピープログラムはとても役に立ちました。

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

具体的なフレーズに反応したのです。落ち着いてください。バレリアンを飲んで寝ましょう、心配するのは体に悪いです。...「C++」と聞いて熱くなる人もいるのでは?

あなただけに返信したのではありませんよ、わからないのであれば、あなたのフレーズはかなり露骨です・・・。心配かどうかは、あなたが参加しなくても、私が自分で決めます。だから失礼のないように、バレリアンを飲むと、私の言うことが嫌になりますよ。

MQLとC++の違いに興味を持ち、憤慨し、困惑している皆さんは、別のトピックを立てて、そこで勝手に議論してください。それとも、お手伝いしましょうか?

 
ブレーク、フィンランド人のイケメンたち。