(続)「システム異常の詳細」からMT4自動復帰のVPS対応。
本気で何かに集中したい時って、やはり寝ても醒めても1つの物事を考え続けた方が良い結果に繋がります。そんな訳で一週間、本業に集中してみました。とりあえず、昨日無事仮納品を済ませて、ほっとしてます。とは言うものの、「一難去ってまた一難 でもみんながいるから頑張れる!」なデスマーチが進行中で、9月末までは、あぅぅぅな日々がえぅぅです。。><;
それはさておき、表題について、稀代のEA使い pkramsus さんから頂いたコメントの件、早速調査してみました。
pkramsus 2010/09/02 00:06
こんばんは。VPSで勝手に使用させていただいてます。私の環境だけかもしれませんが、VPS上で起動していてもリモートデスクトップ等で実際にコンソールにアクセスしなければ動作しないです。
当方の環境ですが
CNSVPS , OSはWin2003 Enterprise X64 Edition
です。
なにかしら心当ございましたらレスいただけるとありがたいです。
リモートデスクトップのセッションを閉じた状態やユーザー切り替えでログオフした状態では、Windowsはアプリの画面を描画・更新する必要がありません。(..だって、ユーザに見てもらう画面が無いんですもん..)
そのため、AutoHotkeyのコマンドで画面の状態を検出して動作する処理が期待通りには動かない事が判明しました。AutoHotkeyから参照できる画面の情報はずっと、セッションを閉じる直前のもの?のようで、MT4が「システム異常の詳細」ダイアログを出していても反映されないのです。
対策としては、
(1) VNC や、超高速リモートデスクトップTrueRemote等を試す。
これらは、ログイン状態にある画面を別のPCにコピーする仕組みで動くので今回の問題は起きない..かもしれません。未確認です..。
(2) AutoHotkey 本体から、無理やり画面情報を更新させてやる。
ウィンドウ内の文字列を最新に更新したかったら WM_PAINT 、新規ダイアログの検出をしたかったら WM_CHILDACTIVATE を定期的にアプリに送り続ければ良さそうです。..たぶん。
コードはこんな感じ。
#WinActivateForce SetTitleMatchMode,2 Loop { WinGet, id, list, ahk_class MetaQuotes::MetaTrader::4.00 Loop, %id% { this_id := id%A_Index% PostMessage,0x22, 0, 0, , ahk_id %this_id% ;WM_CHILDACTIVATE = 0x22 } ;SoundPlay *-1 if(WinExist("システム異常の詳細") or WinExist("Crash Details")){ SoundPlay *48 WinGet, pid,PID FullPath :=GetModuleFileNameEx(pid) WinKill Run,%FullPath% } Sleep, 5000 } 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 }
ダウンロードは、http://ux.getuploader.com/fai_fx/download/181/MT4CrashReboot2.zip からどうぞ。
※ 12:58 ログ出力機能を追加しました。