ナビゲータウィンドウの更新と、MT4の再起動をショートカットで。

今日は、AutoHotKeyにナビゲータウィンドウの更新と、MT4の再起動をさせるショートカットキー割当てをします。


複数のMT4 を使用していると、あるMT4 の indicators フォルダに .mq4 をコピー後、ダブルクリックして MetaEditor を起動させても、別のMT4 のMetaEditor が立ち上がってしまい、その状態でCompile してもナビゲータウィンドウに 新しいインジケータが表示されない..というトラブルがよく起こります。
その場合、対象としているMT4 のMetaEditor を起動してコンパイルするか、MT4 自体を再起動させるしか方法がありません。


どちらも大した手間ではないのですが、忘れないうちに紹介しておきます。





以下のコードは、「Win + R」でナビゲータウィンドウのリロード、「Win + B」で MT4 の再起動をします。 

#r::
   Msg := DllCall("RegisterWindowMessage", Str,"MetaTrader4_Internal_Message", Int) 
   count :=1
   Loop,1280{
   PostMessage, Msg,0x303D,0xC000+count
   count :=count+1
   }
   ;MsgBox,Refresh done
   return
#b::
   WinGet, pid,PID,A
   FullPath :=GetModuleFileNameEx(pid)
   WinClose , A
   ;Process, Close,%pid%
   Run,%FullPath%
   return


GetModuleFileNameEx() を.ahkファイル内で定義していない場合は、以下を追加します。

GetModuleFileNameEx(ProcessID)  ; modified version of shimanov's function
{
  ; #define PROCESS_VM_READ           (0x0010)
  ; #define PROCESS_QUERY_INFORMATION (0x0400)
  hProcess := DllCall( "OpenProcess", "UInt", 0x10|0x400, "Int", False, "UInt", ProcessID)
  if (ErrorLevel or hProcess = 0)
    Return
  FileNameSize := 260
  VarSetCapacity(ModuleFileName, FileNameSize, 0)
  CallResult := DllCall("Psapi.dll\GetModuleFileNameExA", "UInt", hProcess, "UInt", 0, "Str", ModuleFileName, "UInt", FileNameSize)
  DllCall("CloseHandle", hProcess)
  Return ModuleFileName
}

MT4の再起動は、以前に紹介した experts フォルダを開くテクニックの応用ですが、ナビゲータウィンドウのリロードは、ちょっと怪しいコードになっています。
MetaEditor でコンパイルをすると、ある1つのウィンドウメッセージがMetaTraderに送られて、その結果、ナビウィンドウが再読込みされるのですが、ウィンドウメッセージのパラメータに何を指定すれば良いのかが分からないのです。(汗

PostMessage, Msg,0x303D,0xC000+count

の 0xC000+count という部分が不明な部分で、この値は MT4 のインストール先によって変わってしまうようで、AutoHotKeyでは正しい値が分かりません。
そこで、Loop,1280{ .. } で、それっぽい値 ( 0xC000 〜 0xC500 )を絨毯爆撃させています。普通のアプリなら無関係なメッセージを送られても無視されるだけなので、たぶん問題ないと思いますが、この範囲外の値で更新されているMT4 ではこのままでは使えないので要注意です。