مشكلات PostMessageW في MQL4
الصفحة 1 من 289 12 الأخيرةالأخيرة
Results 1 to 10 of 13

Thread: مشكلات PostMessageW في MQL4

  1. #1
    مرحباً جميعاً،

    إنني أتساءل عما إذا كان أي معلمي الكود قادرين على مساعدتي في الاتجاه الصحيح في هذا الأمر. أنا عكس محترف البرمجة ، لكنني أمضيت ساعات لا حصر لها على لوحة تداول تأتي بشكل جيد للغاية ، وأواجه بعض الأخطاء التي لا يمكنني معرفة كيفية تجاوزها. هذا المنشور يعالج الخطأ الأول. آسف مقدما للطول.

    لقد وجدت واستخدمت كتلة التعليمات البرمجية من هذا الموضوع لتمكينني من إضافة مؤشرات من واجهة المستخدم المخصصة الخاصة بي عند الطلب:
    https://www.mql5.com/en/forum/73391/page3(المنشور رقم 27 بواسطة Kray). اضطررت إلى إجراء تعديلات طفيفة فيما يتعلق باستخدام أوامر Sleep و keybd ، وعمومًا ، كان يعمل. (لاحظ كما أعترف أدناه ، أنا مخترق ، لذلك إذا كنت تعتقد أن استخدامي لهذه الأوامر مكرر بطبيعته وغبي ، فأنا متأكد من أنك على صواب - ولكن عندما وجدت مزيجًا نجح ، لم أكن أرغب في ذلك للعبث بها ، لأنها كانت هشة بالنسبة لي.)
    منجم أدناه:

    تم إدراج رمز #import user32.dll int GetAncestor (int، int) ؛ int RegisterWindowMessageW (سلسلة MessageName) ؛/For Start مؤشر مخصص int PostMessageW (int hwnd، int msg، int wparam، uchar Name # 91؛ # 93؛) ؛/For Start المؤشر المخصص int FindWindowW (سلسلة lpszClass ، سلسلة lpszWindow) ؛/لمؤشر البدء المخصص/int keybd_event (int bVk، int bScan، int dwFlags، int dwExtraInfo) ؛/For Start المؤشر المخصص #import #define VK_RETURN 13/ENTER key # import/For Start المؤشر المخصص باطل StartCustomIndicator (int hWnd ، string IndicatorName ، bool AutomaticallyAcceptDefaults = true)/true = تخطي مربع حوار المؤشر {Sleep ( 100) ؛ uchar name2 # 91 ؛ # 93 ؛ ؛ StringToCharArray (IndicatorName، name2،0، StringLen (IndicatorName)) ؛ طباعة (IndicatorName = IndicatorName) ؛ طباعة (ArraySize (name2) = ArraySize (name2)) ؛ لـ (int i = 0 ؛ i lt ؛ ArraySize (name2) ؛ i ) {Print (name2 # 91 ؛ i # 93 ؛ = name2 # 91 ؛ i # 93 ؛) ؛ } int MessageNumber = RegisterWindowMessageW (MetaTrader4_Internal_Message) ؛ النوم (100) ؛ int r = PostMessageW (hWnd ، MessageNumber ، 15 ، name2) ؛ النوم (200) ؛ إذا (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 حرفًا بالضبط ، فسيتم إلغاء حظري. استمر هذا بشكل عام بنجاح لعدة أيام ، وربما حتى أسبوع أو أسبوعين. ولكن بشكل متقطع ، سأواجه مشكلة حيث تم تفسير المؤشر وسلسلة المسار بشكل غير صحيح من خلال ما يمكنني تحديده فقط ليكون وظيفة PostMessageW. عندما فشل ، كان يقوم بالإبلاغ عن أحرف إضافية أو غير منطقية في اسم الملف الذي يحاول فتحه. لذا بدلاً من قول ”لا يمكن فتح ملف” MyIndies \ MyIndicator.ex4 ”، فإنه سيظهر أنه لا يمكن فتح الملف” MyIndies \ MyIndicator؟ L .ex4. ” لذلك لمدة أسبوع أو أسبوعين جيدًا ، عادةً ما يتم تحميل المؤشر بشكل جيد ، ولكن بشكل متقطع سيتم تفسير مسار واسم المؤشر الخاص بي بشكل غير صحيح. في هذه الحالات (ربما بعد تغيير إطارات المخططات ، أو النقر فوق علامات تبويب أخرى ، أو غيابي لبعض الوقت) ، يمكنني عادةً إعادة تحميل القالب أو EA والعودة إلى الحالة الجيدة. من المثير للاهتمام ، في جميع الحالات ، أن بيانات الطباعة الخاصة بي في كتلة التعليمات البرمجية أعلاه تعرض دائمًا نتائج متسقة. إنها متسقة من حيث وقت استدعاء المؤشر بنجاح وكذلك عند تفسير متغيرات متعددة لاسم الملف غير الصحيح. لا يمكنني إلا أن أخمن أن الخطأ حدث في أمر PostMessageW ، على الرغم من أنني لم أتمكن من إجباره على إعادة إنتاج الخطأ عند الطلب ، وبالتأكيد ليس لدي أي فكرة عن السبب.

    في اليوم أو اليومين الأخيرين ، فجأة كنت أتلقى رسائل الخطأ دائمًا. اكتشفت من خلال بعض التجارب والخطأ أنه إذا قمت بتقليص طول اسم المؤشر الخاص بي من 15 حرفًا إلى 14 حرفًا ، فسأعود إلى الحالة الجيدة. كان من الواضح جدًا أن الرقم 15 كان الرقم السحري من قبل ، والآن الرقم السحري هو 14. لا أعرف لماذا سيكون أي رقم رقمًا سحريًا ، ناهيك عن سبب تغييره بشكل واضح ونهائي منذ يوم أو يومين. أنا عالق تمامًا في فهم أي من هذا وأعمى عن كيفية عمل عناصر واجهة برمجة تطبيقات Windows هذه ، وأنا مستاء عندما يتعلق الأمر بالعمل مع uchars أيضًا. لقد أمضيت ساعات في البحث على Google ومحاولة حلها ولكن دون جدوى.

    إذا كان بإمكان أي شخص شرح ذلك ، أو مساعدتي في حله ، أو حتى توجيهي إلى مورد حيث يمكنني مساعدة نفسي ، سأكون في غاية الامتنان.

    إذا كنت قد قرأت هذا الآن ، أشكرك كثيرًا.
    قدم

  2. #2
    2 المرفق (المرفقات) تم اختباره باللغات الإنجليزية والألمانية والروسية والعربية والصينية. بالنسبة لي فهو يعمل في كل مكان (أحدث إصدار من MT4MetaEditor 5.00 الإصدار 2318). مرفق نص الاختبار الذي يعمل معي.
    https://www.forexdrop.com/attachment...1979508731.mq4
    https://www.forexdrop.com/attachment...1931182141.ex4

  3. #3

    Quote Originally Posted by ;
    {quote} يفتح مربع حوار المؤشر ولكن النقر فوق ”موافق” مفقود - لذلك تظل نافذة حوار المؤشر مفتوحة إلى الأبد ويظهر لي الخطأ: لم يتم العثور على مربع حوار المؤشر (لم يتم العثور على وظيفة FindWindowW () في نافذة الحوار - hWnd يبقى 0)
    استبدل الزر بالكامل بالنقر برسالة windows المناسبة. كان بإمكاني البحث عن ”موافق” ولكن بعد ذلك سوف يفشل مرة أخرى إذا قام المستخدم بتبديل اللغات الطرفية. والآن اختبرت قبل التحميل :-) هل يعمل من أجلك؟ إصدار العمل المصحح: رمز إدراج #import user32.dll int RegisterWindowMessageW (سلسلة lpString) ؛ int FindWindowW (سلسلة lpClassName ، سلسلة lpWindowName) ، int GetDlgItem (int hDlg، int nIdDlgItem) ؛ int SetActiveWindow (int hWnd) ، منطقي PostMessageA (int hWnd، int msg، int wParam، uchar lParam # 91؛ # 93؛) ؛ منطقي 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_OK 1/control id لزر Ok في مربع حوار المؤشر المخصص #define BM_CLICK 0x00F5 uchar buffer # 91 ؛ MAX_PATH # 93 ؛؛** * *void StartCustomIndicator (int hWnd، string IndicName، bool autoCloseDlg = true) {StringToCharArray (اسم المؤشر ، المخزن المؤقت) ؛ int WM_MT4 = RegisterWindowMessageW (MetaTrader4_Internal_Message) ، PostMessageA (hWnd ، WM_MT4 ، MT4_LOAD_CUSTOM_INDICATOR ، المخزن المؤقت) ؛ إذا (autoCloseDlg) {سلسلة className ، العنوان = مؤشر مخصص - اسم المؤشر ؛ كثافة العمليات أنا = 0 ؛ while (i lt؛ 5) {Sleep (200)؛ int hWndDlg = FindWindowW (className ، العنوان) ، إذا (hWndDlg! = 0) {int hWndOk = GetDlgItem (hWndDlg، IDC_CUSTOM_INDICATOR_OK) ؛ إذا (hWndOk! = 0) {SetActiveWindow (hWndDlg) ؛ PostMessageW (hWndOk، BM_CLICK، 0، 0) ؛ } else Print (خطأ: \ OK \ button غير موجود) ؛ فترة راحة؛ } أنا ؛ إذا (i gt ؛ = 5) طباعة (خطأ: مربع الحوار \ العنوان \ غير موجود) ؛ }}

  4. #4

    Quote Originally Posted by ;
    {quote} نعم ، هذا هراء MQL5. كحل بديل ، كان علي إضافة استيراد دالة ثانية. هل هذا يصلح؟ شكرًا :-)
    يفتح مربع حوار المؤشر ولكن النقر فوق ”موافق” مفقود - لذلك تظل نافذة حوار المؤشر مفتوحة إلى الأبد ويظهر لي الخطأ: لم يتم العثور على مربع حوار المؤشر (لم يتم العثور على وظيفة FindWindowW () في نافذة الحوار - يبقى hWnd 0)

  5. #5

    Quote Originally Posted by ;
    {quote} تلقيت هذا الخطأ عند محاولة التحويل البرمجي (MT4MetaEditor 5.00 build 2302) {صورة}
    نعم ، هذا هو MQL5 في أفضل حالاته. كحل بديل ، كان علي إضافة استيراد دالة ثانية. إطلاق برنامج VirtualBox واختباره باستخدام برنامج التحويل البرمجي MT5. يبدو لإصلاحه. شكرًا :-)

  6. #6
    1 مرفق (ق)
    Quote Originally Posted by ;
    هل يمكن لشخص لديه معرفة MQL4.5 أن يؤكد أن السلاسل المحلية تمت تهيئتها بشكل صريح باستخدام مؤشر NULL؟ ما هي السلاسل العامةالثابتة التي تم تهيئتها باستخدام؟ مؤشر فارغ؟ سلسلة فارغة؟ شكرًا
    الحصول على هذا الخطأ عند محاولة التحويل البرمجي (MT4MetaEditor 5.00 build 2302)

  7. #7
    هل يمكن لشخص لديه معرفة MQL4.5 تأكيد أن السلاسل المحلية تمت تهيئتها بشكل صريح باستخدام مؤشر NULL؟ ما هي السلاسل العامةالثابتة التي تم تهيئتها باستخدام؟ مؤشر فارغ؟ سلسلة فارغة؟ شكرا

  8. #8

    Quote Originally Posted by ;
    لقد كان هذا رائعًا ...
    هناك المزيد من الأخطاء في البرنامج النصي الخاص بك. (1) لا ينبغي استخدام keybd_event (). إنها مرهقة وعرضة للخطأ. لديك مرتين عبارة متطابقة في التعليمات البرمجية الخاصة بك وهي لا تعمل. هذا وحده يثبت وجهة نظري. (2) استدعاء FindWindowW () غير صالح. تمرر NULL كمعامل أول وهو في الحقيقة int (صفر). نظرًا لأن توقيع الاستيراد الخاص بك يتوقع سلسلة ، يتم تحويل العدد الصحيح 0 إلى السلسلة 0 وتمريره كاسم فئة. لن تجد FindWindow () أبدًا أي شيء من هذا القبيل لأن فئة تسمى 0 غير موجودة في النظام. جرب المقتطف المرفق في التعليمات البرمجية الخاصة بك. لقد قمت بإزالة العناصر ذات الصلة بلوحة المفاتيح وبدلاً من ذلك انقر مباشرة فوق الزر ”موافق” في مربع الحوار. أفضل بكثير من التعامل مع رموز المفاتيح الافتراضية. قد تكون هناك تحذيراتأخطاء في المترجم حيث يمكنني اختبارها فقط باستخدام مترجم ANSI MQL. نسخة معطلة ، نسخة مصححة في المنشور # 11 رمز تم إدخاله #import user32.dll int RegisterWindowMessageW (سلسلة lpString) ؛ منطقي PostMessageA (int hWnd، int msg، int wParam، uchar lParam # 91؛ # 93؛) ؛ منطقي PostMessageW (int hWnd ، int msg ، int wParam ، int lParam) ؛ int FindWindowW (سلسلة lpClassName ، سلسلة 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_OK 1/control id of Ok button in Custom Indicator الحوار #define IDC_CUSTOM_INDICATOR_CANCEL 2/... ؛** * *void StartCustomIndicator (int hWnd، string IndicName، bool autoCloseDlg = true) {StringToCharArray (اسم المؤشر ، المخزن المؤقت) ؛ int WM_MT4 = RegisterWindowMessageW (MetaTrader4_Internal_Message) ، PostMessageA (hWnd ، WM_MT4 ، MT4_LOAD_CUSTOM_INDICATOR ، المخزن المؤقت) ؛ إذا (autoCloseDlg) {سلسلة className ، العنوان = مؤشر مخصص - اسم المؤشر ؛ كثافة العمليات أنا = 0 ؛ while (i lt؛ 5) {Sleep (200)؛ hWnd = FindWindowW (className ، العنوان) ، إذا (hWnd! = 0) {PostMessageW (hWnd، WM_COMMAND، IDC_CUSTOM_INDICATOR_OK، 0) ؛ فترة راحة؛ } أنا ؛ إذا (i gt ؛ = 5) طباعة (خطأ: لم يتم العثور على مربع حوار المؤشر) ؛ }}} كما ترى قمت بتمرير مؤشر NULL حقيقي (سلسلة غير مهيأة) كأول معلمة لـ FindWindow (). لماذا تعمل التعليمات البرمجية الخاصة بك في بعض الأحيان وأحيانًا لا تعمل؟ بسبب استخدام keybd_event (). نادرًا ما ينجح إلقاء ضغطات المفاتيح على نظام التشغيل لديك. في وقت ما يحدث ذلك. لم تنجح مكالمة PostMessage () الثانية مطلقًا لأن المقبض المستخدم كان دائمًا غير صالح. تحرير: متغير bugfix تم تعريفه بالفعل تحرير: تم تمرير معلمة bugfix كمرجع ، متغير متوقع

  9. #9
    كان هذا رائعا. لقد أجريت التحديثات وأنا غير محظور تمامًا بشأن هذه المشكلة. شكرا جزيلا للمساعدة لك! في رسالتي السابقة ، ذكرت أن هذا كان مجرد خطأ واحد. الآخرون أقل شدة لكني ما زلت أحاول حلها. الخطوة التالية هي أن اثنين من مؤشراتي المخصصة ترفضان إغلاق مربع حوار المؤشر تلقائيًا عندما أحاول تمكينهما تلقائيًا باستخدام الرمز من رسالتي السابقة ؛ بالنسبة لهذين المؤشرين ، تظهر النافذة وتبقى هناك حتى أنقر فوق ”موافق”. القاسم المشترك الوحيد الذي يمكنني رؤيته بينهما هو أنهما يرسمان بالفعل خطوطًا على الرسم البياني - أحدهما يرسم عدة خطوط عمودية ؛ المخططات الأخرى متعددة الخطوط الأفقية. لا يبدو هذا سببًا جيدًا بما يكفي لعدم إغلاق مربعات حوار المؤشرات الخاصة بهم من تلقاء نفسها عندما يفعل الآخرون ذلك ، ولكنه الشيء الوحيد الذي أراه يجعل هذه الصناديق مختلفة عن الآخرين. هل هناك أي أسباب واضحة أو منطقية تجعل العديد من المؤشرات تغلق مربع الحوار تلقائيًا باستخدام الكود أعلاه ، ولكن هذين المؤشرين العنيدين لن يفعلوا ذلك؟ شكرا مرة أخرى مقدما ، FtN

  10. #10
    يجب أن تكون السلسلة لتحويل الصفيف فقط: رمز مدرج StringToCharArray (IndicatorName، name2)؛ سيؤدي هذا إلى نسخ السلسلة ويتضمن صفرًا نهائيًا.

أذونات النشر

  • لا تستطيع إضافة مواضيع جديدة
  • لا تستطيع الرد على المواضيع
  • لا تستطيع إرفاق ملفات
  • لا تستطيع تعديل مشاركاتك
  •  
  • رمز BB مفعل
  • الابتسامات مفعلة
  • رمز[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.