2012-01-06 17 views
6

यदि कोई विंडो, उदाहरण के लिए फ़ायरफ़ॉक्स, Firefox से Stack Overflow - Firefox पर अपना शीर्षक बदलता है, तो मैं चाहता हूं कि मेरा ऐप रिकॉर्ड करे कि फ़ायरफ़ॉक्स ने अपना शीर्षक बदल दिया है।विंडो शीर्षक बदल गया ईवेंट

क्या यह एक हुक और लूप (एनमविंडोज़) के उपयोग के बिना संभव है? अगर केवल एक हुक के साथ किया जा सकता है, किस तरह के हुक?

+0

क्या आप एक ब्राउज़र के साथ-साथ रीडायरेक्ट के बारे में बात कर रहे हैं ..? क्या आपने अनुरोध/प्रतिक्रिया और हेडर तक पहुंचने की खोज की है ?? बस उत्सुक है कि मैं आपके जैसा ही पृष्ठ पर हूं .. – MethodMan

+1

हां, हुक आवश्यक है। बहुत यकीन है कि मैंने आपको पहले ही WH_SHELL के बारे में बताया है। –

+1

संभावित डुप्लिकेट [विंडोज़ में बंद सभी विंडोज़ लॉग इन करें] (http://stackoverflow.com/questions/8648386/log-all-windows-that-are-closed-in-windows) –

उत्तर

9

WinEvents यहां जाने का तरीका है। आपको जिस एपीआई की आवश्यकता है वह SetWinEventHook() है - यदि आप किसी विशिष्ट विंडो की परवाह करते हैं, तो HWND के threadId प्राप्त करने के लिए GetWindowThreadProcessId() का उपयोग करें और फिर केवल उस विशिष्ट थ्रेड से ईवेंट सुनें। विंडो शीर्षक परिवर्तनों के लिए, आप EVENT_OBJECT_NAMECHANGE ईवेंट चाहते हैं।

आप या तो "संदर्भ में" या "संदर्भ से बाहर" हुक कर सकते हैं - बाद वाला सबसे आसान है, और इसका मतलब है कि ईवेंट को अपनी प्रक्रिया में वापस भेज दिया जाता है, इसलिए आपको एक अलग डीएलएल की आवश्यकता नहीं है - जो इसे बनाता है सी # में यह सब करने के लिए संभव है; लेकिन SetWinEventHook को कॉल करने वाले थ्रेड में संदेश लूप (GetMessage/TranslationMessage/DispatchMessage) होना चाहिए, क्योंकि ईवेंट दृश्यों के पीछे संदेशों के रूप में वितरित किए जाते हैं।

अपने विनइवेंट कॉलबैक में, आपको यह जांचना होगा कि एचडब्ल्यूएनडी वह है जिसे आप परवाह करते हैं, क्योंकि आपको उस लक्ष्य धागे पर किसी भी यूआई के लिए नाम परिवर्तन मिलेगा, संभवतः बाल विंडो नाम परिवर्तन, या अन्य चीजें आप परवाह नहीं है।

-

वैसे, आप जाँच कर सकते हैं WinEvents का उपयोग करता है कुछ नमूना सी # कोड के लिए this answer; यह डेस्कटॉप पर सभी विंडोज़ में अग्रभूमि विंडो परिवर्तनों को ट्रैक करने के लिए उनका उपयोग कर रहा है; लेकिन किसी विशिष्ट विंडो पर नाम परिवर्तनों को ट्रैक करने के लिए ऊपर उल्लिखित कुछ सरल संशोधन करना चाहिए।

+1

EVENT_OBJECT_NAMECHANGE बहुत कुछ होता है, यह तब भी ट्रिगर होता है जब आप माउस को उसी विंडो के उसी टैब पर ले जाते हैं! क्या यह आपके द्वारा "संभवतः बाल विंडो नाम परिवर्तन सहित" से संबंधित है, लेकिन इससे बचने के लिए कैसे? कॉलबैक में बस एक ही आवर्ती "विंडो शीर्षक" को अनदेखा कर रहे हैं? – JohnTube

+1

यदि आप केवल एक प्रक्रिया में बदलावों में रुचि रखते हैं, तो आप 'SetWindowEventHook' कॉल में प्रक्रिया की आईडी निर्दिष्ट कर सकते हैं, जो मनाई गई घटनाओं की संख्या को बहुत कम कर देगा। –

+0

@ ब्रेंडनएमसीके मुझे पूर्व में विंडोज़ स्विच करते समय खिताब मिल रहा है। क्रोम> नोटपैड> विजुअलस्टूडियो से लेकिन विज़ुअलस्टूडियो में क्रोम या दस्तावेज़ परिवर्तन के टैब परिवर्तन के लिए ईवेंट को कार्यान्वित करने का तरीका नहीं मिल रहा है। क्या आप मदद कर सकते हैं? सादर –

3

आपको एक हुक (या आपके प्रश्न में उल्लिखित मतदान तकनीक) की आवश्यकता होगी।

मूल रूप से विंडोज एपीआई में, "विंडो कैप्शन" को बदलने के लिए - या अधिक सटीक रूप से विंडो का पाठ - आप WM_SETTEXT भेजते हैं, इसलिए आपके हुक को उस संदेश को अवरुद्ध करने की आवश्यकता है। आपको जिस हुक प्रकार की आवश्यकता है वह WH_CALLWNDPROC है और केवल यह जांचें कि आप जिस संदेश को प्राप्त कर रहे हैं वह WM_SETTEXT है और hWnd आपके द्वारा देखे जा रहे एप्लिकेशन के लिए मुख्य विंडो है (इसलिए आपको सेट करने की कोशिश करने वाले एप्लिकेशन की तरह झूठी सकारात्मक नहीं मिलती है बच्चों की खिड़कियों का पाठ)।

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

+1

यह काम करेगा, लेकिन यह सबसे आसान तरीका नहीं है। WH_CALLWNDPROC हुक के साथ पकड़ यह है कि आपको एक अलग सी/सी ++ डीएलएल की आवश्यकता होगी - आप इसे सी # में नहीं कर सकते हैं। (इसके अलावा आपको 32 और 64-बिट कोड के लिए अलग-अलग हुक की आवश्यकता होगी, यदि आप इसकी परवाह करते हैं।) SetWinEventHook यहां बेहतर फिट होगा, क्योंकि आप अपनी प्रक्रिया में वापस अधिसूचना दे सकते हैं, एक की आवश्यकता से परहेज करते हैं अलग डीएलएल। – BrendanMcK

+0

आपने पहले ही अपना उत्तर पोस्ट कर दिया है, इस टिप्पणी से परेशान क्यों हैं? – Blindy

+5

ताकि एक संभावित भविष्य एसओ रीडर समझ सके कि दोनों तकनीकें एक-दूसरे से कैसे संबंधित हैं, या यह चेतावनी देखेंगे भले ही स्वीकार्य उत्तर केवल स्कैन करें; एक टिप्पणी के अलग जवाब की तुलना में बेहतर स्थानिक इलाके है। – BrendanMcK

-7

आपको किसी भी हुक की आवश्यकता नहीं है। बस विंडोज़ घटनाओं का उपयोग करें

+3

....... जैसे? – LarsTech

+0

@fred, यह एक बहुत ही उपयोगी उत्तर नहीं है: विंडोज़ में कई सुविधाएं उपलब्ध हैं जिन्हें घटनाओं के रूप में वर्णित किया जा सकता है। यदि आप "विधवा घटनाक्रम" के लिए Google हैं, तो आपको पहले मैच के रूप में विंडोज इवेंट लॉगिंग के लिए हिट मिलती है, जो पूरी तरह से असंबंधित तकनीक है। कम से कम एक एपीआई नाम या इसी तरह दें - अधिमानतः एक लिंक के साथ - ताकि पाठक समझ सके कि आप किस बारे में बात कर रहे हैं। – BrendanMcK

संबंधित मुद्दे