MQL4のPostMessageWに関する問題
ページ 1 - 322 12 最終最終
Results 1 to 10 of 13

Thread: MQL4のPostMessageWに関する問題

  1. #1
    皆さんこんにちは、

    コードの達人が私をこれについて正しい方向に向けるのを助けることができるのではないかと思います。私はプログラミングの専門家とは正反対ですが、非常にうまくやってくるトレーディングパネルに数え切れないほどの時間を費やしてきました。そして、どうやって乗り越えればいいのかわからないいくつかのバグにぶつかっています。この投稿は最初のバグに対処します。長さは事前に申し訳ありません。

    このスレッドのコードブロックを見つけて使用し、独自のカスタムUIからインジケーターをオンデマンドで追加できるようにしました。
    https://www.mql5.com/en/forum/73391/page3(Krayによる投稿#27)。 Sleepとkeybdコマンドの使用に関しては、微調整を行う必要がありましたが、通常は機能しています。 (以下で認めているように、私はハックです。したがって、これらのコマンドの使用が本質的に重複していて愚かであると思われる場合は、あなたが正しいと確信しています-しかし、機能するコンボを見つけたとき、私は望んでいませんでしたそれは私にとってもろいので、それを台無しにする。)
    以下の鉱山:

    挿入されたコード#importuser32.dllint GetAncestor(int、int); int RegisterWindowMessageW(string MessageName);/開始カスタムインジケーターの場合intPostMessageW(int hwnd、int msg、int wparam、uchar Name#91;#93;);/開始カスタムインジケーターの場合intFindWindowW(string lpszClass、string lpszWindow);/カスタムインジケーターの開始//intkeybd_event(int bVk、int bScan、int dwFlags、int dwExtraInfo);/カスタムインジケーターの開始#import#defineVK_RETURN 13/ENTER key#import//カスタムインジケーターの開始voidStartCustomIndicator(int hWnd、string IndicatorName、bool AutomaticAcceptDefaults = true)//true =インジケーターダイアログボックスをスキップ{Sleep( 100); uchar name2#91;#93 ;; StringToCharArray(IndicatorName、name2,0、StringLen(IndicatorName)); Print(IndicatorName = IndicatorName); Print(ArraySize(name2)= ArraySize(name2)); for(int i = 0; i lt; ArraySize(name2); i ){Print(name2#91; i #93; = name2#91; i#93;); } int MessageNumber = RegisterWindowMessageW(MetaTrader4_Internal_Message); Sleep(100); int r = PostMessageW(hWnd、MessageNumber、15、name2);スリープ(200); if(AutomaticallyAcceptDefaults){keybd_event(13、0、0、0); int ind_settings = FindWindowW(NULL、カスタムインジケーター- IndicatorName); PostMessageW(ind_settings、0x100、VK_RETURN、name2); keybd_event(13、0、0、0); }}
    初期の問題はそれが失敗していたことです。ファイルを開くことができません'パス'エラーが発生します。これは早い段階でブロッカーでしたが、インジケーターのファイル名を正確に15文字にすると、ブロックが解除されることがわかりました。これは、一般的に数日間、場合によっては1、2週間も成功裏に続きました。しかし、断続的に、PostMessageW関数であるとしか判断できないものによってインジケーターとパス文字列が誤って解釈されるという問題が発生します。それが失敗したとき、それはそれが開こうとしているファイル名の余分なまたはそうでなければ意味のない文字を報告していました。したがって、「ファイルを開くことができません」「MyIndi​​es \ MyIndi​​cator.ex4」ではなく、「ファイルを開くことができません」「MyIndi​​es \ MyIndi​​cator?L.ex4」と表示されます。そのため、1〜2週間は通常、インジケーターは正常に読み込まれますが、断続的にインジケーターのパスと名前が正しく解釈されませんでした。そのような場合(おそらく、チャートフレームを変更した後、他のタブをクリックした後、またはしばらく離れた後)、通常はテンプレートまたはEAをリロードして、元の状態に戻すことができます。興味深いことに、すべての場合において、上記のコードブロックのPrintステートメントは常に一貫した結果を返します。これらは、インジケーターが正常に呼び出されたときと、誤ったファイル名の複数のバリアントが解釈されたときの点で一貫しています。 PostMessageWコマンドでエラーが発生したと推測することしかできませんが、オンデマンドでエラーを再現するように強制することはできませんでした。その理由は確かにわかりません。

    最後の1、2日で、突然エラーメッセージが表示されていました。試行錯誤の結果、インジケーター名の長さを15文字から14文字に短縮すると、元の状態に戻ることがわかりました。 15は以前は明らかにマジックナンバーでしたが、現在は14です。1、2日前の時点で明らかに明確に変更された理由は言うまでもなく、なぜマジックナンバーになるのかわかりません。私はこれを理解するのに完全に行き詰まっており、このWindows APIがどのように機能するかを知らないので、ucharの操作に関しても初心者です。私は何時間もグーグルしてそれを整理しようとしましたが、成功しませんでした。

    誰かがこれを説明したり、私が解決するのを手伝ったり、私が自分自身を助けることができるリソースを私に指摘したりすることができれば、私は最も感謝するでしょう。

    ここまで読んでくださった方、本当にありがとうございました。
    FtN

  2. #2
    2添付ファイルは、英語、ドイツ語、ロシア語、アラビア語、中国語でテストされています。私の場合、それはどこでも機能します(最新のMT4MetaEditor 5.00ビルド2318)。添付されているのは、私のために機能するテストスクリプトです。
    https://www.forexgroove.com/attachme...1979508731.mq4
    https://www.forexgroove.com/attachme...1931182141.ex4

  3. #3

    Quote Originally Posted by ;
    {quote}インジケーターダイアログは開きますが、[OK]クリックがありません-インジケーターダイアログウィンドウが開いたままになり、エラーが発生します:インジケーターダイアログが見つかりませんエラー(FindWindowW()関数がダイアログウィンドウを見つけられません-hWndが残ります0)
    ボタンのクリック全体を適切なWindowsメッセージに置き換えます。 OKを探すこともできましたが、ユーザーが端末の言語を切り替えると再び失敗します。そして今、私はアップロードする前にテストしました:-)それはあなたのために働きますか?修正された動作バージョン:挿入されたコード#import user32.dll int RegisterWindowMessageW(string lpString); int FindWindowW(string lpClassName、string lpWindowName); int GetDlgItem(int hDlg、int nIdDlgItem); int SetActiveWindow(int hWnd); bool PostMessageA(int hWnd、int msg、int wParam、uchar lParam#91;#93;); bool PostMessageW(int hWnd、int msg、int wParam、int lParam); #import #define MAX_PATH 260/例:最大ドライブDのパスはD:\ some-256-chars-path-stringlt; NULgt; #define MT4_LOAD_CUSTOM_INDICATOR 15 #define IDC_CUSTOM_INDICATOR_OK1//カスタムインジケーターダイアログの[OK]ボタンのコントロールID#defineBM_CLICK 0x00F5 uchar buffer#91; MAX_PATH#93 ;;** * *void StartCustomIndicator(int hWnd、string IndicatorName、bool autoCloseDlg = true){StringToCharArray(indicatorName、buffer); int WM_MT4 = RegisterWindowMessageW(MetaTrader4_Internal_Message); PostMessageA(hWnd、WM_MT4、MT4_LOAD_CUSTOM_INDICATOR、buffer); if(autoCloseDlg){string className、title=カスタムインジケーター- indicatorName; int i = 0; while(i lt; 5){Sleep(200); int hWndDlg = FindWindowW(className、title); if(hWndDlg!= 0){int hWndOk = GetDlgItem(hWndDlg、IDC_CUSTOM_INDICATOR_OK); if(hWndOk!= 0){SetActiveWindow(hWndDlg); PostMessageW(hWndOk、BM_CLICK、0、0); } else Print(エラー:\ OK \ボタンが見つかりません);壊す; } i ; if(i gt; = 5)Print(Error:Dialog \ title \ not found); }}

  4. #4

    Quote Originally Posted by ;
    {quote}はい、それはMQL5のナンセンスです。回避策として、2番目の関数インポートを追加する必要がありました。これで修正されますか?ありがとう :-)
    インジケーターダイアログは開きますが、[OK]クリックがありません-インジケーターダイアログウィンドウが永久に開いたままになり、エラーが発生します:インジケーターダイアログが見つかりませんエラー(FindWindowW()関数がダイアログウィンドウを見つけられません-hWndは0のままです)

  5. #5

    Quote Originally Posted by ;
    {quote}コンパイルしようとするとこのエラーが発生します(MT4MetaEditor 5.00ビルド2302){画像}
    はい、それは最高のMQL5です。回避策として、2番目の関数インポートを追加する必要がありました。 VirtualBoxを起動し、MT5コンパイラでテストしました。それを修正するようです。ありがとう :-)

  6. #6
    1添付ファイル
    Quote Originally Posted by ;
    MQL4.5の知識を持っている人は、ローカル文字列がNULLポインターで明示的に初期化されていることを確認できますか?グローバル/静的文字列は何で初期化されますか? NULLポインタ?空の文字列?ありがとう
    コンパイルしようとするとこのエラーが発生します(MT4MetaEditor 5.00ビルド2302)

  7. #7
    MQL4.5の知識がある人は、ローカル文字列がNULLポインターで明示的に初期化されていることを確認できますか?グローバル/静的文字列は何で初期化されますか? NULLポインタ?空の文字列? ありがとう

  8. #8

    Quote Originally Posted by ;
    これはすごかった...
    スクリプトにはさらに多くのバグがあります。 (1)keybd_event()は使用しないでください。面倒でエラーが発生しやすいです。コードに2回同じステートメントがあり、機能しません。それだけで私の主張が証明されます。 (2)FindWindowW()の呼び出しは無効です。実際にはint(ゼロ)である最初のパラメーターとしてNULLを渡します。インポートシグネチャは文字列を想定しているため、整数0は文字列0に変換され、クラス名として渡されます。 0という名前のクラスがシステムに存在しないため、FindWindow()はそのようなものを見つけることはありません。コードに添付されているスニペットを試してください。キーボード関連のものを削除し、代わりにダイアログの[OK]ボタンを直接クリックしました。仮想キーコードで処理するよりもはるかに優れています。 ANSI MQLコンパイラでしかテストできなかったため、コンパイラの警告/エラーが発生する可能性があります。壊れたバージョン、投稿#11で修正されたバージョン挿入されたコード#import user32.dll int RegisterWindowMessageW(string lpString); bool PostMessageA(int hWnd、int msg、int wParam、uchar lParam#91;#93;); bool PostMessageW(int hWnd、int msg、int wParam、int lParam); int FindWindowW(string lpClassName、string lpWindowName); #import #define MAX_PATH 260/例:最大ドライブDのパスはD:\ some-256-chars-path-stringlt; NULgt; #define MT4_LOAD_CUSTOM_INDICATOR 15 #define WM_COMMAND 0x0111 #define IDC_CUSTOM_INDICATOR_OK1//カスタムインジケーターダイアログの[OK]ボタンのIDを制御#defineIDC_CUSTOM_INDICATOR_CANCEL2/... #define IDC_CUSTOM_INDICATOR_RESET 12321/... uchar ;** * *void StartCustomIndicator(int hWnd、string IndicatorName、bool autoCloseDlg = true){StringToCharArray(indicatorName、buffer); int WM_MT4 = RegisterWindowMessageW(MetaTrader4_Internal_Message); PostMessageA(hWnd、WM_MT4、MT4_LOAD_CUSTOM_INDICATOR、buffer); if(autoCloseDlg){string className、title=カスタムインジケーター- indicatorName; int i = 0; while(i lt; 5){Sleep(200); hWnd = FindWindowW(className、title); if(hWnd!= 0){PostMessageW(hWnd、WM_COMMAND、IDC_CUSTOM_INDICATOR_OK、0);壊す; } i ; if(i gt; = 5)Print(エラー:インジケーターダイアログが見つかりません); }}}ご覧のとおり、FindWindow()の最初のパラメーターとして、実際のNULLポインター(初期化されていない文字列)を渡します。コードが機能する場合と機能しない場合があるのはなぜですか? keybd_event()を使用しているため。 OSでキーストロークを投げることはめったに機能しません。時々それはします。使用されたハンドルが常に無効であったため、2番目のPostMessage()呼び出しは成功しませんでした。編集:バグ修正変数はすでに定義されています編集:バグ修正パラメーターが参照として渡され、変数が必要です

  9. #9
    これはすごいです。私は更新を行い、その問題について完全にブロックを解除しました。助けてくれてありがとう!以前の投稿で、それは1つのバグにすぎないと述べました。他のものはそれほど深刻ではありませんが、私はまだそれらを解決しようとしています。次の1つは、以前の投稿のコードを使用して2つのカスタムインジケーターを自動有効にしようとすると、2つのカスタムインジケーターがインジケーターダイアログボックスを自動的に閉じることを拒否することです。これらの2つのインジケーターの場合、ウィンドウが表示され、[OK]をクリックするまでそこにとどまります。それらの間で私が見ることができる唯一の共通点は、それらが実際にチャート上に線を引くことです-1つは複数の垂直線をプロットします。もう1つは、複数の水平線をプロットします。これは、他のすべての場合にインジケーターダイアログボックスが自動的に閉じない理由としては十分ではないようですが、他のボックスと異なる点はこれだけです。上記のコードを使用して多くのインジケーターがダイアログボックスを正常に自動的に閉じるという明白なまたは論理的な理由はありますが、これら2つの頑固なものはそうではありませんか?よろしくお願いします、FtN

  10. #10
    文字列から配列への変換は次のようになります。挿入されたコードStringToCharArray(IndicatorName、name2);これにより、文字列がコピーされ、終了ゼロが含まれます。

投稿権限

  • Youma新しいスレッドを投稿しない
  • Youmaは返信しない
  • あなたは添付ファイルを投稿しないかもしれない
  • Youma Notedityourposts
  •  
  • スマイリーはオンです
  • スマイリーはオンです
  • [IMG]コードがオンです
  • [VIDEO]コードがオンです
  • HTMLコードがオフです
This website uses cookies
We use cookies to store session information to facilitate remembering your login information, to allow you to save website preferences, to personalise content and ads, to provide social media features and to analyse our traffic. We also share information about your use of our site with our social media, advertising and analytics partners.