विंडोज 8 में टच स्क्रीन और स्टाइलस के साथ आर्कानम और फॉलआउट 2

किसी तरह यह पता चला कि मुझे विंडोज 8 टैबलेट मिला है। बहुत सफल मॉडल नहीं है - सहायक के रूप में भारी, बल्कि कार्य केंद्र के रूप में कमजोर, लेकिन एक स्टाइलस के साथ, और सबसे महत्वपूर्ण बात, 32-बिट Win32 प्रणाली के साथ। जीओजी और स्टीम की बिक्री से एक निश्चित संख्या में पुराने खेल होने के बाद, मैंने किसी तरह इस टैबलेट के साथ बैठकर हर उस चीज को फिर से खेलना शुरू किया, जो संभव और असंभव है। लेकिन किसी तरह पर्याप्त समय और मूड नहीं था, और यहां तक ​​कि ट्रायल रन से पता चला कि आपको माउस के साथ खेलने की आवश्यकता है - टच स्क्रीन से कर्सर दूर किसी को नहीं पता था कि कहां है, और एक लंबे प्रेस के साथ राइट-क्लिक करना स्पष्ट रूप से असुविधाजनक होगा। टैबलेट को जीओजी से हाल ही में फॉलआउट वितरण तक कोने में आधे साल तक धूल फांकता रहा और इस वितरण ने मुझे एक्शन में धकेल दिया। शुक्रवार की शाम शुरू हुई, टैबलेट को एक यूएसबी माउस मिला, और मैं सोफे पर आराम से बैठ गया और सूची को बहुत ऊपर से शुरू किया - आर्कनम के साथ।
चरित्र बनाने के आधे घंटे के बाद (और यह एक बहुत ही महत्वपूर्ण और जिम्मेदार मामला है!) बाएं हाथ ने डिवाइस को मुश्किल से पकड़ रखा है, और दाएं कलाई को संदिग्ध रूप से खींचना शुरू कर दिया, सुरंग सिंड्रोम और एक असहज पकड़ के अन्य खुशियों को इंगित करता है। एक निश्चित एर्गोनोमिक फोल्डिंग माउस के डेवलपर्स के लिए एक अच्छा शब्द नहीं याद करते हुए, मैं ड्राइवरों, पैच, या कम से कम कुछ और टचस्क्रीन या कम से कम स्टाइलस से खेलने के लिए देखने के लिए चढ़ गया।
कोई पैच नहीं मिला। केवल समान ड्राइवर का भुगतान किया गया था और परीक्षण मोड के बिना। और उस क्षण मेरे दिमाग में एक विचार आया (मुझे अब समझ में आया!) ने सोचा - "आखिरकार, कुछ WM_TOUCH निश्चित रूप से आएंगे और इसे गलत तरीके से WM_MOUSEMOVE में बदल दिया जाएगा" ... आगे दौड़ते हुए, अर्चितम अब पूरी तरह से मेरे टचस्क्रीन को नियंत्रित करता है, हालांकि, सप्ताहांत खत्म हो गया है और खेलने से ज्यादा नींद आती है।

अधीर के लिए
यह परियोजना जीथब पर उपलब्ध है, स्रोत और एक बाइनरी हैं। यह एक DLL फ़ाइल है जिसे rundll32 के माध्यम से खेलने के लिए एक लांचर के रूप में उपयोग किया जाना चाहिए। दो अंगुलियों से दबाने पर दायाँ क्लिक होता है, तीन अंगुलियों से दबाने पर ESC कुंजी का अनुकरण होता है - यह आर्कनम के लिए पर्याप्त है। फॉलआउट 2 को बीटा मोड में सपोर्ट किया गया है, निर्देश वहां है, जीथब पर। राइट-क्लिक करने से वहां काम नहीं होता, कर्सर कभी-कभी शिफ्ट हो जाता है, लेकिन इसे स्क्रीन के निचले बाएं कोने में खींचकर ठीक किया जा सकता है।


दृश्य स्टूडियो 6.0


किसी तरह यह पता चला कि मैं एक दर्जन साल पहले Win32 के तहत हुक, पैच और इंजेक्शन से बीमार था और फिर बहुत खुशी के साथ इस पेज को अपने जीवन में बंद कर दिया। और अब, "आधे घंटे खेलने और फिर खेलने के लिए" का सपना देख रहा हूं, मैंने एक पुरानी हार्ड ड्राइव निकाली, कुछ प्रोजेक्ट और मेरा पसंदीदा उपकरण लिखा - वीएस 98, उर्फ ​​विज़ुअल स्टूडियो 6.0। हां, मैं लगातार W8 और WP मोबाइल कार्यक्रमों के लिए VS 2012 का उपयोग करता हूं, लेकिन मुझे लगता है कि मुझे इस बात का कोई अंदाजा नहीं है कि इसमें प्लेटफॉर्म एसडीके कैसा दिखता है और अगर C # या C ++ में निम्न-स्तरीय चीजों को कोड करने जैसा कुछ फैशनेबल / अनिवार्य हो गया है / क्ली। और फिर यह पता चला कि VS98 एक ही समय में 120 मेगाबाइट के अपने वजन के साथ और मेरे काम करने वाली मशीन पर शराब के तहत ठीक काम करता है।
टिन से पुरानी परियोजनाओं को साफ करना, जैसे कि IAT स्पूफिंग में देरी हो रही थी, लेकिन कुछ घंटों के बाद मैंने खेल में अपने मॉड्यूल को लागू किया और इसके संदेश प्रवाह को ट्रैक कर सकता था (सेटविंडॉन्गॉन्ग और ब्ला ब्ला ब्ला के माध्यम से उपवर्ग)। स्पाई ++ ने, स्पष्ट कारणों के लिए, एक फुल-स्क्रीन गेम के साथ काम नहीं करना चाहता था, क्योंकि मैंने लॉग लिखा था और फिर एक माउस और एक स्पर्श की तरह दिखने वाली हर चीज का अध्ययन किया। यह शुक्रवार की शाम को समाप्त हो गया और मैंने सुबह की निरंतरता को स्थगित कर दिया।

WM_TOUCH


सुबह मैंने टचस्क्रीन के साथ काम करने के बारे में कुछ लेख लिखे और WM_TOUCH को पकड़ने के लिए बैठ गए। एक उत्कृष्ट संदेश, यह नियमित रूप से आता है, हालांकि इसमें एक ब्लॉक में दस या दो क्लिक होते हैं। यह दिलचस्प था कि निर्देशांक खेल में सही ढंग से आए - वे बिल्कुल स्क्रीन पर क्लिक करने के स्थान के अनुरूप थे। ऐसा प्रतीत नहीं हुआ, क्योंकि मैंने हर घटना के साथ WM_MOUSEMOVE उत्पन्न करना शुरू कर दिया था। परिणाम ने मुझे चौंका दिया - कुछ भी नहीं बदला है। कुछ भी नहीं। SetCursorPos के साथ WM_MOUSEMOVE को बदला और फिर भी परिणाम देखा - कर्सर रेंगना काफी कम अराजक हो गया। ऐसा लग रहा था कि बात टोपी में थी - आपको बस यह समझने की ज़रूरत है कि क्या गलत हो रहा है और हर बार कर्सर किनारे क्यों जाता है ... केवल जब यह सड़क पर अंधेरा हो गया, मुझे एहसास हुआ कि कुछ गलत हो गया है :) सभी तार्किक और गैर-तार्किक तरीके, सूत्र, समन्वय समायोजित करना, माउस के साथ जादू टोना करना / रोकना, SendInput, कुछ घटनाओं को रद्द करना - किसी भी स्थिति में मैं कर्सर को क्लिक करने की जगह पर ले जाने में सक्षम नहीं था। यह बकवास या रहस्यवाद लग रहा था, लेकिन खेल के अंदर कहीं न कहीं एक निर्देशांक की एक जोड़ी थी जो एक तरह से बदल गई जिसे मैं समझ नहीं पाया और सीधे नियंत्रित नहीं था।

प्रत्यक्ष और अखिल-सब


रविवार को, मैं ध्वस्त हो गया, लेकिन फिर भी विश्वसनीय था। आज मैं हर चीज को दोहराने की कोशिश करना चाहता था जो वास्तविक माउस से आती है, लेकिन टचस्क्रीन डेटा के साथ। मैंने एक कृंतक में प्लग किया और उसके कार्यों को ट्रैक करना शुरू कर दिया, और फिर यह पता चला कि माउस क्रियाएं मेरी विंडो प्रक्रिया से बिल्कुल भी नहीं गुज़रती थीं। खुद को गधा कहने वाले को खेलों की वास्तविकताओं का पता नहीं है, मैंने Google में खोदा और मुझे पता चला कि मेरे लिए क्या भ्रम था: अक्सर खेलों को प्रत्यक्ष संदेश के माध्यम से या कच्चे रूप में माउस के बारे में जानकारी प्राप्त होती है, विंडो संदेश कतार को दरकिनार करते हुए। टचस्क्रीन और स्टाइलस की घटनाएं केवल एक अपवाद हैं - वे संदेश कतार से गुजरते हैं और कहीं-कहीं डिफीडोप्रो के धनुष में माउस के साथ क्रियाओं में बदल जाते हैं। तदनुसार, WM_MOUSEMOVE और अन्य जैसे कि यह पूरी तरह से अनुपस्थित हो सकता है (और यह माउस के लिए होता है) और उन्हें, विकल्प, आदि भेजने का प्रयास किसी भी तरह से खेल को प्रभावित नहीं करता है। शाब्दिक रूप से, मेरे प्रयोगों में से दो-तिहाई को केवल खेल द्वारा नजरअंदाज कर दिया गया था, और बाकी डिफिवंडोप्रोक के साथ संघर्ष में थे। इसके अलावा, WM_TOUCH को केवल विंडोज 7 कार्यक्रमों के साथ संगतता के लिए भेजा गया था, और WM_POINTER * को पहले से ही विंडोज 8 में मुख्य टच इवेंट माना जाता है।

दुर्घटना या मछली पकड़ने?


इस स्तर पर, मुझे पहले से ही पता था कि मुझे क्या चाहिए और सुरंग के अंत में प्रकाश को देखा - मैं DefWindowProc को टचस्क्रीन घटनाओं को बिल्कुल भी संसाधित नहीं करने दूंगा और मैं खुद सब कुछ करूंगा। भावनात्मक उथल-पुथल ने अपना काम किया और किसी समय, अप्रत्याशित रूप से, टचस्क्रीन ने कर्सर को दबाने की जगह पर रखना शुरू कर दिया। यह अजीब था, क्योंकि अवरोधन मॉड्यूल अभी तक तैयार नहीं था। वांछित क्षेत्र के लिए एक द्विभाजन खोज (हम कार्यक्रम के आधे हिस्से को बंद करते हैं और व्यवहार को देखते हैं, फिर या तो इसे वापस कर देते हैं या शेष कोड के आधे से बंद कर देते हैं) ने दिखाया कि मैंने एक साथ कॉल किया
RegisterTouchWindow(hWnd, TWF_WANTPALM) 
और
 SetProp(hWnd, "MicrosoftTabletPenServiceProperty", (HANDLE)1); 

* अंतिम कमांड के आइडियल लुक और अर्थ के बावजूद, यह 2003 टैबलेट पीसी के लिए काफी सही और प्रलेखित है
इन दोनों विधियों को कॉल करने से तथ्य यह होता है कि WM_TOUCH में हमें एक बार में केवल एक ही समन्वय प्राप्त होता है, और DefWindowProc के आंतरिक भाग अपेक्षाकृत सही निर्देशांक उत्पन्न करते हैं। लेकिन तथ्य यह है कि आमतौर पर WM_TOUCH को दबाए जाने पर तुरंत नहीं भेजा जाता है, लेकिन "प्रेस एंड होल्ड" सुविधा के लिए डेटा जमा करता है। क्या विशेषता है, सहकर्मियों को पहले से ही एक समान स्थिति का सामना करना पड़ा :
चार दिनों की व्यर्थता के अंत में, मैंने हार मान ली और दो काम किए। सबसे पहले, मैंने MSDN मंचों पर एक संदेश पोस्ट किया जिसमें पूछा गया था कि "क्या बकवास है", हालांकि मैंने वास्तव में पोस्ट में "बकवास" शब्द का उपयोग नहीं किया था क्योंकि मुझे लगा कि यह एक स्वचालित अस्वीकृति को ट्रिगर कर सकता है।
(...)
शुक्र है, कुछ दिनों बाद, मेरे आश्चर्य के लिए, किसी ने वास्तव में मेरे मंच पोस्ट का जवाब दिया। इसमें, उन्होंने मुझे 2003 में लिखे एक तकनीकी लेख में संदर्भित किया, जिसमें दिखाया गया था कि मैं वास्तव में वही करना चाहता था जो मैं चाहता था: टेबलेटपीसी एपीआई के साथ खिलवाड़ करने के बजाय, आप बस अपनी खिड़की पर एक गुप्त वैश्विक पाठ परमाणु सेट करें, और पूफ! टेबलेटपीसी आपकी विंडो के लिए प्रेस और पकड़ को निष्क्रिय करता है।
(...)
इसलिए, किसी भी तरह, सभी पुस्तकालयों में, कई पुस्तकालयों और सैकड़ों GUIDs और पृष्ठों और वर्ग प्रलेखन के पन्नों के साथ, टेबलेटपीसी SDK एक परिभाषित, या यहाँ तक कि इस विशेष परमाणु के अस्तित्व का उल्लेख करने में विफल रहा। या "प्रेस और होल्ड" क्या था (क्योंकि यह शुरू करने से पहले उस शब्द को जानने के लिए वास्तव में उपयोगी होगा - मैं इस तरह से गुप्त तकनीकी लेख को खोजने में सक्षम हो सकता हूं)।

यह एक पूर्ण समाधान नहीं था, लेकिन फिर भी बहुत बड़ी प्रगति थी! दरअसल, यह इस विधा में था कि फॉलआउट 2 खेलने योग्य हो गया, हालांकि यह कभी-कभार आभासी और वास्तविक निर्देशांक के संयोग को खो देता है - कर्सर को किनारे पर स्थानांतरित कर देता है। यह कर्सर को एक ऐसी जगह पर खींचकर खेल में सही तरीके से हल किया जाता है जहां यह अब नहीं जा सकता।

पूर्ण कार्यान्वयन


इसके अलावा, सब कुछ प्रौद्योगिकी का विषय था - जब डेफिंडोवप्रोक ने दखल देना बंद कर दिया और WM_TOUCH / WP_POINTER ने ग्लूइंग रोक दिया, तो मैंने उन्हें प्रोसेस करना और mouse_event के माध्यम से घटनाओं को भेजना शुरू कर दिया; कर्सर व्यवहार पूर्वानुमान योग्य हो गया है। केवल एक चीज जिसे हल नहीं किया जा सकता था वह था माउस और टचस्क्रीन का एक बार का संचालन। माउस WM_ संदेशों को बिल्कुल उत्पन्न नहीं करता है, इसलिए हम इसके सटीक निर्देशांक का पता नहीं लगा सकते हैं, और GetCursorPos केवल वही देते हैं जो हम खुद वहां लिखते हैं। टचस्क्रीन घटनाओं पर कब्जा करने के बाद, GetCursorPos के मूल्य आम तौर पर बदलना बंद हो गए, हालांकि कर्सर माउस और स्पर्श के साथ चला गया। आर्कनम के लिए, सही बटन अभी भी महत्वपूर्ण है, क्योंकि इसे दो उंगलियों से दबाकर लटका दिया गया था। मेनू से बाहर निकलने और बचाने के लिए, आपको ईएससी की आवश्यकता है, इसने 3 या अधिक उंगलियों के इशारे पर जड़ ली है। मैंने आज इस पर रुकने का फैसला किया, कोड को मंजूरी दे दी, जीथब पर अपलोड कर दिया और ... खेलने के बजाय, मैं हैबर पर एक लेख लिखने के लिए बैठ गया;)

संशयवादी और उदासीन के लिए

स्पेल को एक टचस्क्रीन के साथ चुना गया था, उपयोग किया गया था, और फिर दाएं "क्लिक" के साथ कास्ट मोड छोड़ दिया गया था
परिचयात्मक वीडियो टैप द्वारा छोड़ दिए जाते हैं, चरित्र बनाया जाता है और सूची को एक टचस्क्रीन के साथ भी खोला जाता है (यह "साफ" संस्करण पर संभव नहीं है)



कीड़े और खामियां




समर्थन


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

UPD: दोपहर के भोजन के समय, मैंने वीएस 2012 को प्रोजेक्ट को अपडेट किया, विंडोज 8 के ऑटो-शटडाउन को जोड़ा, स्टाइलस पर बटन का समर्थन। उसी समय मैंने एएसआई लोडर के साथ काम करने की कोशिश की, लेकिन कुछ काम नहीं आया। इसने स्टार्टअप पर एक अजीब दुर्घटना भी पकड़ी और इसके लिए एक हैक फिक्स किया।

UPD 2: जैसा कि यह निकला, लाइब्रेरी सही ढंग से काम नहीं कर रही थी अगर माउस में एक नॉन-डिफॉल्ट स्पीड थी या "एक्सटेंडेड पॉइंटर सटीकता" सक्षम थी। मुझे अभी तक इस समस्या का पूर्ण समाधान दिखाई नहीं दे रहा है, क्योंकि DLL स्टार्टअप पर इन वस्तुओं को बंद कर देता है, क्योंकि वे स्पर्श नियंत्रण के अनुकूल नहीं हैं। यदि किसी को दिलचस्पी है, तो "उन्नत परिशुद्धता" किसी का बेवकूफ मजाक है जो किसी भी धुरी पर माउस ऑफसेट को दोगुना करता है यदि इसका मूल्य 6 पिक्सेल से अधिक है और अगर यह 10. से अधिक है तो यह चौगुनी है। माउस को 7 पिक्सेल बाईं ओर और 12 को ऊपर ले जाने से, इस मोड के साथ हमें बाईं ओर 48 पिक्सेल और ऑफ़-अप के लिए 14 पिक्सेल मिलेंगे। मुझे इसमें कोई बढ़ी हुई सटीकता नहीं दिख रही है, इसके अलावा, 6 और 10 की सीमाएं एक दशक पहले सिस्टम के अंदर कहीं रखी गई हैं और उपयोगकर्ता द्वारा परिवर्तित नहीं की जा सकती हैं।

Source: https://habr.com/ru/post/In206142/


All Articles