MQL4 में PostMessageW के साथ समस्याएं
पेज 1 का 532 1 2 पिछलापिछला
Results 1 to 10 of 13

Thread: MQL4 में PostMessageW के साथ समस्याएं

  1. #1
    नवागत jsamchwwfx6's Avatar
    प्रविष्टियाँ
    2
    हेलो सब लोग,

    मैं सोच रहा हूं कि क्या कोई कोड गुरु मुझे इस पर सही दिशा में इंगित करने में मदद कर सकता है। मैं एक प्रोग्रामिंग पेशेवर के विपरीत हूं, लेकिन मैंने एक ट्रेडिंग पैनल पर अनगिनत घंटे बिताए हैं जो बहुत अच्छी तरह से आ रहा है, और मैं कुछ बग मार रहा हूं जिन्हें मैं समझ नहीं पा रहा हूं कि कैसे प्राप्त किया जाए। यह पोस्ट पहली बग को संबोधित करता है। लंबाई के लिए अग्रिम खेद है।

    मैंने मांग पर अपने स्वयं के कस्टम UI से संकेतक जोड़ने में सक्षम करने के लिए इस थ्रेड से कोड ब्लॉक पाया और उसका उपयोग किया:
    https://www.mql5.com/en/forum/73391/page3(क्रे द्वारा #27 पोस्ट करें)। स्लीप और कीबड कमांड का उपयोग करने के मामले में मुझे मामूली बदलाव करने पड़े, और आम तौर पर, यह काम कर रहा है। (ध्यान दें जैसा कि मैंने नीचे स्वीकार किया है, मैं एक हैक हूं, इसलिए यदि आपको लगता है कि इन आदेशों का मेरा उपयोग प्रकृति और गूंगा में डुप्लिकेट है, तो मुझे यकीन है कि आप सही हैं - लेकिन जब मुझे एक कॉम्बो मिला जो काम करता था तो मैं नहीं चाहता था इसके साथ खिलवाड़ करने के लिए, क्योंकि यह मेरे लिए भंगुर रहा है।)
    मेरा नीचे:

    डाला गया कोड #import user32.dll int GetAncestor(int, int); int RegisterWindowMessageW (स्ट्रिंग MessageName);/स्टार्ट कस्टम इंडिकेटर के लिए int PostMessageW (int hwnd, int msg, int wparam, uchar Name#91;#93;);/स्टार्ट कस्टम इंडिकेटर int FindWindowW (स्ट्रिंग lpszClass, string lpszWindow) के लिए;/स्टार्ट कस्टम इंडिकेटर के लिए/int keybd_event (int bVk, int bScan, int dwFlags, int dwExtraInfo);/स्टार्ट कस्टम इंडिकेटर के लिए #import #define VK_RETURN 13/ENTER key#import/स्टार्ट कस्टम इंडिकेटर शून्य StartCustomIndicator (int hWnd, string IndicatorName,bool AutomaticallyAcceptDefaults=true)/true = इंडिकेटर डायलॉग बॉक्स छोड़ें {स्लीप (नींद) 100); उच्च नाम 2#91;#93;; StringToCharArray(IndicatorName,name2,0,StringLen( IndicatorName)); प्रिंट (संकेतक नाम = संकेतक नाम); प्रिंट (ऐरेसाइज (नाम 2) == ऐरे साइज (नाम 2)); for (int i = 0; i lt; ArraySize(name2); i ){ Print(name2#91; i #93;= name2#91;i#93;); } int MessageNumber=RegisterWindowMessageW(MetaTrader4_I nternal_Message); नींद (100); int r=PostMessageW(hWnd,MessageNumber,15,name2); नींद (200); अगर (स्वचालित रूप से स्वीकार करें) { keybd_event (13, 0, 0, 0); int ind_settings = FindWindowW (नल, कस्टम इंडिकेटर - इंडिकेटरनाम); PostMessageW (ind_settings, 0x100, VK_RETURN, name2); keybd_event (13, 0, 0, 0); } }
    शुरुआत में मुद्दा यह था कि यह विफल हो रहा था। मुझे फ़ाइल 'पथ' त्रुटि नहीं खोल सकता। यह शुरुआत में एक अवरोधक था, लेकिन फिर मुझे पता चला कि अगर मैंने अपना संकेतक फ़ाइल नाम ठीक 15 वर्णों में बनाया है, तो मुझे अनब्लॉक कर दिया गया था। यह आम तौर पर सफलतापूर्वक कई दिनों तक चला, शायद एक या दो सप्ताह तक भी। लेकिन रुक-रुक कर, मेरे पास एक मुद्दा होगा जहां मेरे संकेतक और पथ स्ट्रिंग की गलत तरीके से व्याख्या की गई थी जिसे मैं केवल PostMessageW फ़ंक्शन के रूप में निर्धारित कर सकता हूं। जब यह विफल हुआ, तो यह फ़ाइल नाम में अतिरिक्त या अन्यथा बकवास वर्णों की रिपोर्ट कर रहा था जिसे वह खोलने का प्रयास कर रहा है। तो यह कहने के बजाय 'MyIndies\MyIndicator.ex4' फ़ाइल नहीं खोल सकता, यह कहेगा कि 'MyIndies\MyIndicator?L .ex4' फ़ाइल नहीं खोल सकता। तो एक या दो सप्ताह के लिए, आमतौर पर संकेतक ठीक लोड होगा, लेकिन रुक-रुक कर मेरे संकेतक पथ और नाम की गलत व्याख्या की जाएगी। उन मामलों में (शायद जब मैंने चार्टफ्रेम बदल दिए, या अन्य टैब पर क्लिक किया, या थोड़ी देर के लिए दूर हो गया), तो मैं आमतौर पर अपने टेम्पलेट या ईए को फिर से लोड कर सकता था और वापस अच्छा हो सकता था। दिलचस्प बात यह है कि सभी मामलों में, उपरोक्त कोड ब्लॉक में मेरे प्रिंट स्टेटमेंट हमेशा सुसंगत परिणाम देते हैं। जब संकेतक को सफलतापूर्वक कहा जाता है और साथ ही जब गलत फ़ाइल नाम के कई रूपों की व्याख्या की जाती है, तो वे सुसंगत होते हैं। मैं केवल अनुमान लगा सकता हूं कि त्रुटि PostMessageW कमांड में होती है, हालांकि मैं इसे मांग पर त्रुटि को पुन: उत्पन्न करने के लिए मजबूर करने में असमर्थ था, और मुझे निश्चित रूप से पता नहीं है कि क्यों।

    आखिरी या दो दिनों में, अचानक मुझे हमेशा त्रुटि संदेश मिल रहे थे। मुझे कुछ परीक्षण और त्रुटि के माध्यम से पता चला कि अगर मैंने अपने संकेतक नाम की लंबाई 15 वर्णों से घटाकर 14 कर दी है, तो मैं वापस अच्छा हो गया हूं। 15 पहले बहुत स्पष्ट रूप से जादू की संख्या थी, और अब जादू की संख्या 14 है। मुझे नहीं पता कि कोई भी संख्या एक जादुई संख्या क्यों होगी, अकेले क्यों यह एक या दो दिन पहले स्पष्ट और निश्चित रूप से बदल गया है। मैं पूरी तरह से इसमें से किसी को समझने में फंस गया हूं और यह विंडोज एपीआई सामान कैसे काम करता है, और जब मैं उचर्स के साथ काम करने की बात करता हूं तो मैं एक नोब हूं। मैंने घंटों गुगली की और इसे सुलझाने की कोशिश की लेकिन कोई सफलता नहीं मिली।

    अगर कोई इसे समझा सकता है, मुझे हल करने में मदद कर सकता है, या मुझे ऐसे संसाधन की ओर भी इशारा कर सकता है जहां मैं अपनी मदद कर सकता हूं, तो मैं बहुत आभारी रहूंगा।

    यदि आपने इसे अब तक पढ़ा है, तो आपका बहुत-बहुत धन्यवाद।
    एफटीएन

  2. #2
    नवागत eslava96's Avatar
    प्रविष्टियाँ
    18
    2 अटैचमेंट का परीक्षण अंग्रेजी, जर्मन, रूसी, अरबी और चीनी के साथ किया गया। मेरे लिए यह हर जगह काम करता है (नवीनतम एमटी 4/मेटाएडिटर 5.00 बिल्ड 2318)। संलग्न परीक्षण स्क्रिप्ट है जो मेरे लिए काम करती है।
    https://www.asjforex.com/attachments...1979508731.mq4
    https://www.asjforex.com/attachments...1931182141.ex4

  3. #3
    नवागत eslava96's Avatar
    प्रविष्टियाँ
    18

    Quote Originally Posted by ;
    {उद्धरण} इंडिकेटर डायलॉग खुलता है लेकिन ओके क्लिक गायब है - इसलिए इंडिकेटर डायलॉग विंडो हमेशा के लिए खुली रहती है और मुझे एरर मिल रहा है: इंडिकेटर डायलॉग नॉट एरर (FindWindowW () फंक्शन डायलॉग विंडो नहीं ढूंढता - hWnd रहता है 0)
    मैं पूरे बटन को उचित विंडोज़ संदेश के साथ क्लिक करके बदल देता हूं। मैं बस ओके की तलाश कर सकता था लेकिन अगर उपयोगकर्ता टर्मिनल भाषाओं को स्विच करता है तो यह फिर से विफल हो जाएगा। और अब मैंने अपलोड करने से पहले परीक्षण किया :-) क्या यह आपके लिए काम करता है? सही कार्य संस्करण: डाला गया कोड #import user32.dll int RegisterWindowMessageW(string lpString); int FindWindowW (स्ट्रिंग lpClassName, स्ट्रिंग lpWindowName); int GetDlgItem (int hDlg, int nIdDlgItem); इंट सेटएक्टिवविंडो (इंट एचडब्ल्यूएनडी); बूल पोस्टमैसेजए (इंट एचडब्ल्यूएनडी, इंट मैसेज, इंट डब्ल्यूपरम, उच्च एलपरम#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/कस्टम इंडिकेटर डायलॉग में ओके बटन का कंट्रोल आईडी #define BM_CLICK 0x00F5 uchar बफर#91;MAX_PATH#93;;** * */शून्य StartCustomIndicator(int hWnd, string इंडीकेटरनाम, बूल ऑटोक्लोज डीएलजी = सच) { StringToCharArray(indicatorName, बफर); int WM_MT4 = RegisterWindowMessageW(MetaTrader4_Internal_Messag e); PostMessageA(hWnd, WM_MT4, MT4_LOAD_CUSTOM_INDICATOR, बफर); अगर (autoCloseDlg) {स्ट्रिंग क्लासनाम, शीर्षक = कस्टम संकेतक - संकेतक नाम; इंट मैं = 0; जबकि (मैं लेफ्टिनेंट; 5) {नींद (200); int hWndDlg = FindWindowW (क्लासनाम, शीर्षक); अगर (hWndDlg!= 0) { int hWndOk = GetDlgItem (hWndDlg, IDC_CUSTOM_INDICATOR_OK); अगर (एचडब्ल्यूएनडीओके! = 0) {सेटएक्टिवविंडो (एचडब्ल्यूएनडीडीए� ��जी); पोस्टमैसेज डब्ल्यू (एचडब्ल्यूएनडीओके, बीएम_क्लिक, 0, 0); } और प्रिंट (त्रुटि: \ OK\ बटन नहीं मिला); टूटना; } मैं ; अगर (i gt;= 5) प्रिंट (त्रुटि: डायलॉग \ शीर्षक \ नहीं मिला); } }

  4. #4
    नवागत juapuimsam's Avatar
    प्रविष्टियाँ
    12

    Quote Originally Posted by ;
    {उद्धरण} हाँ, यह MQL5 बकवास है। वर्कअराउंड के रूप में मुझे दूसरा फ़ंक्शन आयात जोड़ना पड़ा। क्या यह इसे ठीक करता है? धन्यवाद :-)
    इंडिकेटर डायलॉग खुलता है लेकिन ओके क्लिक गायब है - इसलिए इंडिकेटर डायलॉग विंडो हमेशा के लिए खुली रहती है और मुझे एरर मिल रहा है: इंडिकेटर डायलॉग नॉट एरर (FindWindowW () फंक्शन डायलॉग विंडो नहीं ढूंढता - hWnd स्टे 0)

  5. #5
    नवागत eslava96's Avatar
    प्रविष्टियाँ
    18

    Quote Originally Posted by ;
    {उद्धरण} जब मैं संकलन करने का प्रयास करता हूं तो यह त्रुटि प्राप्त करना (एमटी 4/मेटाएडिटर 5.00 बिल्ड 2302) {छवि}
    हाँ, यह MQL5 अपने चरम पर है। वर्कअराउंड के रूप में मुझे दूसरा फ़ंक्शन आयात जोड़ना पड़ा। VirtualBox को लॉन्च किया और MT5 कंपाइलर के साथ परीक्षण किया। इसे ठीक करने लगता है। धन्यवाद :-)

  6. #6
    नवागत juapuimsam's Avatar
    प्रविष्टियाँ
    12
    1 अनुलग्नक
    Quote Originally Posted by ;
    क्या MQL4.5 ज्ञान वाला कोई व्यक्ति पुष्टि कर सकता है कि स्थानीय तार स्पष्ट रूप से NULL सूचक के साथ आरंभ किए गए हैं? वैश्विक/स्थैतिक तार किसके साथ शुरू होते हैं? एक नल सूचक? एक खाली स्ट्रिंग? धन्यवाद
    जब मैं संकलन करने का प्रयास करता हूं तो यह त्रुटि प्राप्त करना (एमटी 4/मेटाएडिटर 5.00 बिल्ड 2302)

  7. #7
    नवागत eslava96's Avatar
    प्रविष्टियाँ
    18
    क्या MQL4.5 ज्ञान वाला कोई व्यक्ति इस बात की पुष्टि कर सकता है कि स्थानीय स्ट्रिंग्स को स्पष्ट रूप से NULL पॉइंटर के साथ इनिशियलाइज़ किया गया है? वैश्विक/स्थैतिक तार किसके साथ शुरू होते हैं? एक नल सूचक? एक खाली स्ट्रिंग? धन्यवाद

  8. #8
    नवागत eslava96's Avatar
    प्रविष्टियाँ
    18

    Quote Originally Posted by ;
    ये कमाल हो गया...
    आपकी स्क्रिप्ट में और भी बग हैं। (1) keybd_event() का उपयोग नहीं किया जाना चाहिए। यह बोझिल और त्रुटि प्रवण है। आपके कोड में दो बार समान कथन है और यह काम नहीं करता है। वही मेरी बात को साबित करता है। (2) FindWindowW () की कॉल अमान्य है। आप NULL को पहले पैरामीटर के रूप में पास करते हैं जो वास्तव में एक int (शून्य) है। जैसा कि आपका आयात हस्ताक्षर एक स्ट्रिंग की अपेक्षा करता है पूर्णांक 0 को स्ट्रिंग 0 में परिवर्तित किया जाता है और एक वर्गनाम के रूप में पारित किया जाता है। FindWindow() को कभी भी ऐसा कुछ नहीं मिलेगा क्योंकि सिस्टम में 0 नाम का वर्ग मौजूद नहीं है। अपने कोड में संलग्न स्निपेट आज़माएं। मैंने कीबोर्ड से संबंधित सामग्री को हटा दिया और इसके बजाय सीधे संवाद के ओके बटन पर क्लिक करें। वर्चुअल कीकोड से निपटने की तुलना में बहुत बेहतर है। कंपाइलर चेतावनियां/त्रुटियां हो सकती हैं क्योंकि मैं केवल एएनएसआई एमक्यूएल कंपाइलर के साथ इसका परीक्षण कर सकता हूं। टूटा हुआ संस्करण, पोस्ट #11 पर सही संस्करण डाला गया कोड #import user32.dll int RegisterWindowMessageW(string lpString); बूल पोस्टमैसेजए (इंट एचडब्ल्यूएनडी, इंट मैसेज, इंट डब्ल्यूपरम, उच्च एलपरम#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/कस्टम इंडिकेटर डायलॉग में ओके बटन का कंट्रोल आईडी #define IDC_CUSTOM_INDICATOR_CANCEL 2/... #define IDC_#_RESET_INDICATOR ... ;** * */शून्य StartCustomIndicator(int hWnd, string इंडीकेटरनाम, बूल ऑटोक्लोज डीएलजी = सच) { StringToCharArray(indicatorName, बफर); int WM_MT4 = RegisterWindowMessageW(MetaTrader4_Internal_Messag e); PostMessageA(hWnd, WM_MT4, MT4_LOAD_CUSTOM_INDICATOR, बफर); अगर (autoCloseDlg) {स्ट्रिंग क्लासनाम, शीर्षक = कस्टम संकेतक - संकेतक नाम; इंट मैं = 0; जबकि (मैं लेफ्टिनेंट; 5) {नींद (200); एचडब्ल्यूएनडी = FindWindowW (क्लासनाम, शीर्षक); अगर (एचडब्ल्यूएनडी! = 0) { पोस्टमैसेजडब्ल्य� � (एचडब्ल्यूएनडी, डब्लूएम_सीओएमएंड, आईडीसी_CUSTOM_INDICATOR_OK, 0); टूटना; } मैं ; अगर (i gt;= 5) प्रिंट (त्रुटि: संकेतक संवाद नहीं मिला); } } } जैसा कि आप देख सकते हैं कि मैं FindWindow () के पहले पैरामीटर के रूप में एक वास्तविक NULL पॉइंटर (एक गैर-आरंभिक स्ट्रिंग) पास करता हूं। आपका कोड कभी-कभी क्यों काम करता है और कभी-कभी नहीं? keybd_event() के उपयोग के कारण। अपने ओएस पर कीस्ट्रोक्स फेंकना शायद ही कभी काम करता है। कभी तो करता है। आपका दूसरा PostMessage() कॉल कभी सफल नहीं हुआ क्योंकि प्रयुक्त हैंडल हमेशा अमान्य था। संपादित करें: बगफिक्स चर पहले से ही परिभाषित है संपादित करें: बगफिक्स पैरामीटर संदर्भ के रूप में पारित किया गया, चर अपेक्षित

  9. #9
    नवागत jsamchwwfx6's Avatar
    प्रविष्टियाँ
    2
    यह कमाल हो गया है। मैंने अपडेट किए हैं और उस मुद्दे पर पूरी तरह से अनब्लॉक हूं। सहायता के लिए आपका बहुत - बहुत धन्यवाद! अपनी पिछली पोस्ट में, मैंने उल्लेख किया था कि वह सिर्फ एक बग था। अन्य कम गंभीर हैं लेकिन मैं अभी भी उन्हें हल करने की कोशिश कर रहा हूं। अगला यह है कि मेरे दो कस्टम संकेतक संकेतक संवाद बॉक्स को स्वत: बंद करने से इनकार करते हैं जब मैं अपनी पिछली पोस्ट से कोड का उपयोग करके उन्हें स्वत: सक्षम करने का प्रयास करता हूं; इन दो संकेतकों के लिए, विंडो ऊपर आती है और जब तक मैं ठीक क्लिक नहीं करता तब तक वहीं रहता है। उनके बीच केवल एक ही समानता मैं देख सकता हूं कि वे वास्तव में चार्ट पर रेखाएं खींचते हैं - एक प्लॉट कई लंबवत रेखाएं; अन्य प्लॉट कई क्षैतिज रेखाएँ। यह उनके संकेतक संवाद बॉक्स के लिए एक अच्छा पर्याप्त कारण नहीं लगता है जब अन्य सभी करते हैं, लेकिन यह केवल एक चीज है जिसे मैं देखता हूं जो दूसरों को अलग बनाता है। क्या कोई स्पष्ट या तार्किक कारण है कि उपरोक्त मेरे कोड का उपयोग करके कई संकेतक सफलतापूर्वक संवाद बॉक्स को स्वतः बंद कर देंगे, लेकिन ये दो जिद्दी नहीं होंगे? फिर से अग्रिम धन्यवाद, FtN

  10. #10
    सदस्य 27's Avatar
    प्रविष्टियाँ
    80
    सरणी रूपांतरण के लिए स्ट्रिंग बस होनी चाहिए: सम्मिलित कोड StringToCharArray(IndicatorName,name2); यह स्ट्रिंग की प्रतिलिपि बनाएगा और एक समाप्ति शून्य शामिल करेगा।

पेज 1 का 532 1 2 पिछलापिछला

लेखन की अनुमति देना

  • अब आप यहाँ नए सूत्र लिख सकते हैं
  • आप उत्तर नहीं लिख सकते हैं
  • आप कोई अटैचमेंट नहीं लगा सकते हैं
  • आप अपने लेख को एडिट नहीं कर सकते हैं
  •  
  • बी बी कोड चालू है
  • स्माइली चालू हैं
  • [IMG] कोड चालू है
  • [VIDEO] कोड चालू है
  • HTML कोड बंद है
कूकी नीति:
asjforex.com वेबसाइट कूकीज का उपयोग करती है और आप इस वेबसाइट का उपयोग जारी रख कर इस से सहमत हैं। अधिक जानकारी के लिए कृपया 'कूकी प्रकटीकरण'पढ़ें।