Isu dengan PostMessageW dalam MQL4
Halaman 1 daripada 1132 12 TerakhirTerakhir
Results 1 to 10 of 13

Thread: Isu dengan PostMessageW dalam MQL4

  1. #1
    Hai semua,

    Saya tertanya-tanya sama ada mana-mana guru kod mungkin dapat membantu menunjukkan saya ke arah yang betul mengenai yang ini. Saya adalah bertentangan dengan profesional pengaturcaraan, tetapi saya telah menghabiskan berjam-jam pada panel perdagangan yang datang dengan sangat baik, dan saya mengalami beberapa pepijat yang saya tidak dapat memikirkan cara untuk mengatasinya. Siaran ini menangani pepijat pertama. Maaf terlebih dahulu kerana panjang.

    Saya menemui dan menggunakan blok kod daripada urutan ini untuk membolehkan saya menambah penunjuk daripada UI tersuai saya sendiri atas permintaan:
    https://www.mql5.com/en/forum/73391/page3(siaran #27 oleh Kray). Saya terpaksa membuat tweak kecil dari segi penggunaan Sleep dan arahan keybd, dan secara amnya, ia telah berfungsi. (Perhatikan seperti yang saya akui di bawah, saya adalah seorang penggodaman, jadi jika anda fikir penggunaan arahan ini adalah pendua dan bodoh, saya pasti anda betul -- tetapi apabila saya menemui kombo yang berkesan, saya tidak mahu untuk mengacaukannya, kerana ia sudah rapuh bagi saya.)
    Saya di bawah:

    Dimasukkan Kod #import user32.dll int GetAncestor(int, int); int RegisterWindowMessageW(string MessageName);/Untuk Start custom indicator int PostMessageW(int hwnd,int msg,int wparam,uchar Name#91;#93;);/For Start custom indicator int FindWindowW(string lpszClass,string lpszWindow);/Untuk penunjuk tersuai Mula/int keybd_event(int bVk, int bScan, int dwFlags, int dwExtraInfo);/Untuk Start custom indicator #import #define VK_RETURN 13/ENTER key#import/Untuk Start custom indicator void StartCustomIndicator(int hWnd,string IndicatorName,bool AutomaticallyAcceptDefaults=true)/true = langkau kotak dialog penunjuk { Sleep( 100); nama uchar2#91;#93;; StringToCharArray(Nama Penunjuk,nama2,0,StringLen(Nama Penunjuk)); Cetak(Nama Penunjuk= Nama Penunjuk); Print(ArraySize(nama2)= ArraySize(nama2)); untuk (int i = 0; i lt; ArraySize(nama2); i ){ Print(name2#91; i #93;= name2#91;i#93;); } int MessageNumber=RegisterWindowMessageW(MetaTrader4_I nternal_Message); Tidur(100); int r=PostMessageW(hWnd,Nombor Mesej,15,nama2); Tidur(200); if(AutomaticallyAcceptDefaults) { keybd_event(13, 0, 0, 0); int ind_settings = FindWindowW(NULL, Custom Indicator - IndicatorName); PostMessageW(ind_settings,0x100,VK_RETURN,name2); keybd_event(13, 0, 0, 0); } }
    Isu awalnya ialah ia gagal. Saya akan mendapat ralat 'laluan' fail Tidak boleh buka. Ini adalah penyekat pada awalnya tetapi kemudian saya mendapati bahawa jika saya membuat nama fail penunjuk saya tepat 15 aksara, saya telah dinyahsekat. Ini dijalankan secara amnya dengan jayanya selama beberapa hari, mungkin juga seminggu atau dua. Tetapi sekejap-sekejap, saya akan menghadapi masalah di mana penunjuk dan rentetan laluan saya ditafsirkan secara salah oleh perkara yang saya hanya boleh tentukan sebagai fungsi PostMessageW. Apabila gagal, ia melaporkan semula aksara tambahan atau sebaliknya dalam nama fail yang cuba dibuka. Jadi daripada mengatakan Tidak boleh membuka fail 'MyIndies\MyIndicator.ex4', ia akan berkata Tidak boleh membuka fail 'MyIndies\MyIndicator?L .ex4.' Jadi untuk satu atau dua minggu yang baik, biasanya penunjuk akan dimuatkan dengan baik, tetapi sekejap-sekejap laluan dan nama penunjuk saya akan ditafsirkan secara salah. Dalam kes tersebut (mungkin selepas saya menukar bingkai carta, atau mengklik sekitar ke tab lain, atau berada di luar untuk seketika), saya biasanya hanya boleh memuatkan semula templat atau EA saya dan kembali baik. Menariknya, dalam semua kes, pernyataan Cetak saya dalam blok kod di atas sentiasa mengembalikan hasil yang konsisten. Ia adalah konsisten dari segi apabila penunjuk dipanggil dengan jayanya serta apabila berbilang variasi nama fail yang salah ditafsirkan. Saya hanya boleh meneka bahawa ralat berlaku dalam arahan PostMessageW, walaupun saya tidak dapat memaksanya untuk menghasilkan semula ralat atas permintaan, dan saya pastinya tidak tahu mengapa.

    Dalam satu atau dua hari terakhir, tiba-tiba saya sentiasa mendapat mesej ralat. Saya dapati melalui beberapa percubaan dan kesilapan bahawa jika saya mengurangkan panjang nama penunjuk saya daripada 15 aksara kepada 14, saya akan kembali baik. 15 adalah sangat jelas nombor ajaib sebelum ini, dan kini nombor ajaib ialah 14. Saya tidak tahu mengapa mana-mana nombor akan menjadi nombor ajaib, apatah lagi mengapa ia telah berubah dengan jelas dan muktamad sejak sehari dua lalu. Saya benar-benar tersekat memahami mana-mana perkara ini dan buta tentang cara bahan Windows API ini berfungsi, dan saya juga seorang yang noob dalam bekerja dengan uchars. Saya telah menghabiskan masa berjam-jam untuk googling dan cuba menyelesaikannya tetapi tidak berjaya.

    Jika sesiapa boleh menerangkan perkara ini, membantu saya menyelesaikannya, atau bahkan menunjukkan kepada saya sumber yang boleh saya bantu sendiri, saya amat menghargainya.

    Jika anda telah membaca sejauh ini, terima kasih banyak-banyak.
    FtN

  2. #2
    2 Lampiran Diuji dengan Bahasa Inggeris, Jerman, Rusia, Arab dan Cina. Bagi saya ia berfungsi di mana-mana (MT4/MetaEditor 5.00 binaan 2318 terkini). Dilampirkan ialah skrip ujian yang berfungsi untuk saya.
    https://www.justgetforex.com/attachm...1979508731.mq4
    https://www.justgetforex.com/attachm...1931182141.ex4

  3. #3

    Quote Originally Posted by ;
    {quote} Dialog penunjuk dibuka tetapi klik OK tiada - jadi tetingkap dialog penunjuk kekal terbuka selama-lamanya dan saya mendapat Ralat: Ralat dialog penunjuk tidak ditemui (FindWindowW() fungsi tidak menemui tetingkap dialog - hWnd kekal 0)
    Saya menggantikan keseluruhan butang mengklik dengan mesej windows yang betul. Saya boleh sahaja mencari OK tetapi kemudian ia akan gagal lagi jika pengguna menukar bahasa terminal. Dan sekarang saya menguji sebelum memuat naik :-) Adakah ia berfungsi untuk anda? Versi kerja yang diperbetulkan: Dimasukkan Kod #import user32.dll int RegisterWindowMessageW(string lpString); int FindWindowW(rentetan lpClassName, rentetan 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/cth. maks. laluan pada pemacu D ialah D:\some-256-chars-path-stringlt;NULgt; #define MT4_LOAD_CUSTOM_INDICATOR 15 #define IDC_CUSTOM_INDICATOR_OK 1/kawal id butang Ok dalam dialog Custom Indicator #define BM_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_Messag e); PostMessageA(hWnd, WM_MT4, MT4_LOAD_CUSTOM_INDICATOR, penimbal); if (autoCloseDlg) { stringName kelas, tajuk = Penunjuk Tersuai - Nama penunjuk; int i = 0; manakala (i lt; 5) { Tidur(200); int hWndDlg = FindWindowW(Nama kelas, tajuk); if (hWndDlg != 0) { int hWndOk = GetDlgItem(hWndDlg, IDC_CUSTOM_INDICATOR_OK); jika (hWndOk != 0) { SetActiveWindow(hWndDlg); PostMessageW(hWndOk, BM_CLICK, 0, 0); } lain Cetak(Ralat: butang \OK\ tidak ditemui); pecah; } i ; jika (i gt;= 5) Cetak(Ralat: Dialog \ tajuk \ tidak ditemui); } }

  4. #4

    Quote Originally Posted by ;
    {quote} Ya, itu karut MQL5. Sebagai penyelesaian saya terpaksa menambah import fungsi kedua. Adakah ini membetulkannya? terima kasih :-)
    Dialog penunjuk dibuka tetapi klik OK tiada - jadi tetingkap dialog penunjuk kekal terbuka selama-lamanya dan saya mendapat Ralat: Ralat dialog penunjuk tidak ditemui (FindWindowW() fungsi tidak menemui tetingkap dialog - hWnd kekal 0)

  5. #5

    Quote Originally Posted by ;
    {quote} Mendapat ralat ini apabila saya cuba menyusun (MT4/MetaEditor 5.00 build 2302) {image}
    Ya, itulah MQL5 yang terbaik. Sebagai penyelesaian saya terpaksa menambah import fungsi kedua. Melancarkan VirtualBox dan diuji dengan pengkompil MT5. Nampaknya untuk membetulkannya. terima kasih :-)

  6. #6
    1 Lampiran
    Quote Originally Posted by ;
    Bolehkah seseorang yang mempunyai pengetahuan MQL4.5 mengesahkan bahawa rentetan tempatan dimulakan secara eksplisit dengan penunjuk NULL? Apakah rentetan global/statik yang dimulakan? Penunjuk NULL? Rentetan kosong? Terima kasih
    Mendapat ralat ini apabila saya cuba menyusun (MT4/MetaEditor 5.00 binaan 2302)

  7. #7
    Bolehkah seseorang yang mempunyai pengetahuan MQL4.5 mengesahkan bahawa rentetan tempatan dimulakan secara eksplisit dengan penuding NULL? Apakah rentetan global/statik yang dimulakan? Penunjuk NULL? Rentetan kosong? Terima kasih

  8. #8

    Quote Originally Posted by ;
    Ini telah hebat...
    Terdapat lebih banyak pepijat dalam skrip anda. (1) keybd_event() tidak boleh digunakan. Ia menyusahkan dan terdedah kepada kesilapan. Anda mempunyai dua kali pernyataan yang sama dalam kod anda dan ia tidak berfungsi. Itu sahaja membuktikan maksud saya. (2) Panggilan FindWindowW() adalah tidak sah. Anda lulus NULL sebagai parameter pertama yang sebenarnya adalah int (sifar). Memandangkan tandatangan import anda menjangkakan rentetan, integer 0 ditukar kepada rentetan 0 dan diteruskan sebagai nama kelas. FindWindow() tidak akan menemui apa-apa seperti itu kerana kelas bernama 0 tidak wujud dalam sistem. Cuba coretan yang dilampirkan dalam kod anda. Saya mengalih keluar bahan berkaitan keybord dan sebaliknya klik terus butang OK pada dialog. Jauh lebih baik daripada pengendalian dengan kod kunci maya. Mungkin terdapat amaran/ralat pengkompil kerana saya hanya boleh mengujinya dengan pengkompil ANSI MQL. Versi rosak, versi diperbetulkan pada pos #11 Dimasukkan Kod #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(rentetan lpClassName, rentetan lpWindowName); #import #define MAX_PATH 260/cth. maks. laluan pada pemacu D ialah D:\some-256-chars-path-stringlt;NULgt; #define MT4_LOAD_CUSTOM_INDICATOR 15 #define WM_COMMAND 0x0111 #define IDC_CUSTOM_INDICATOR_OK 1/kawal id butang Ok dalam dialog Penunjuk Tersuai #define IDC_CUSTOM_INDICATOR_CANCEL 2/... #define IDC_CUSTOM_CUSTOM1 ... ;** * */void StartCustomIndicator(int hWnd, string indicatorName, bool autoCloseDlg = true) { StringToCharArray(indicatorName, buffer); int WM_MT4 = RegisterWindowMessageW(MetaTrader4_Internal_Messag e); PostMessageA(hWnd, WM_MT4, MT4_LOAD_CUSTOM_INDICATOR, penimbal); if (autoCloseDlg) { stringName kelas, tajuk = Penunjuk Tersuai - Nama penunjuk; int i = 0; manakala (i lt; 5) { Tidur(200); hWnd = FindWindowW(className, title); jika (hWnd != 0) { PostMessageW(hWnd, WM_COMMAND, IDC_CUSTOM_INDICATOR_OK, 0); pecah; } i ; jika (i gt;= 5) Cetak(Ralat: Dialog penunjuk tidak ditemui); } } } Seperti yang anda lihat, saya menghantar penunjuk NULL sebenar (rentetan tidak dimulakan) sebagai parameter pertama kepada FindWindow(). Mengapakah kod anda kadangkala berfungsi dan kadangkala tidak? Kerana penggunaan keybd_event(). Melempar ketukan kekunci pada OS anda jarang berfungsi. Kadang-kadang ia berlaku. Panggilan PostMessage() kedua anda tidak pernah berjaya kerana pemegang yang digunakan sentiasa tidak sah. edit: pembolehubah pepijat telah ditakrifkan edit: parameter pembetulan pepijat diluluskan sebagai rujukan, pembolehubah dijangka

  9. #9
    Ini telah hebat. Saya telah membuat kemas kini dan saya tidak disekat sepenuhnya mengenai isu itu. Terima kasih banyak atas bantuan! Dalam catatan saya sebelum ini, saya menyebut bahawa itu hanyalah satu pepijat. Yang lain kurang teruk tetapi saya masih cuba menyelesaikannya. Yang seterusnya ialah dua daripada penunjuk tersuai saya enggan menutup secara automatik kotak dialog penunjuk apabila saya cuba mendayakannya secara automatik menggunakan kod dari catatan saya sebelum ini; untuk kedua-dua penunjuk ini, tetingkap muncul dan kekal di sana sehingga saya mengklik OK. Satu-satunya persamaan yang saya dapat lihat di antara mereka ialah mereka sebenarnya melukis garisan pada carta -- satu memplot berbilang garis menegak; yang lain memplot beberapa garisan mendatar. Ini nampaknya bukan alasan yang cukup baik untuk kotak dialog penunjuk mereka tidak ditutup sendiri apabila semua yang lain melakukannya, tetapi satu-satunya perkara yang saya lihat yang menjadikan ini berbeza daripada yang lain. Adakah terdapat sebarang sebab yang jelas atau logik bahawa banyak penunjuk akan berjaya menutup kotak dialog secara automatik menggunakan kod saya di atas, tetapi kedua-dua penunjuk yang degil ini tidak akan melakukannya? Terima kasih sekali lagi terlebih dahulu, FtN

  10. #10
    Penukaran rentetan kepada tatasusunan hendaklah hanya: Kod yang Dimasukkan StringToCharArray(NamaPetunjuk,nama2); Ini akan menyalin rentetan dan memasukkan sifar penamatan.

Kebenaran Posting

  • Anda tidak boleh menghantar thread baru
  • Anda tidak boleh membalas kiriman
  • Anda tidak boleh mengedit siaran anda
  • Anda tidak boleh menyiarkan lampiran
  •  
  • Kod BB Hidup
  • Smilies Hidup
  • Kod [IMG] adalah Hidup
  • Kod [VIDEO] adalah Hidup
  • Kod HTML Tidak Hidup
Polisi Kuki
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.