दिलचस्प पोस्ट
PHPMyAdmin में फ़ाइल आकार सीमा आयात करें स्विफ्ट फंक्शन में एसिंक कॉल से डेटा रिटर्निंग अपलोड करने से पहले छवि का आकार बदलना कैसे प्रकार 1 9 .5 में एक enum प्रकार की प्रोग्राममैटिक गणना है? .txt फ़ाइल में लिखें? जावा में नाम से एक वर्ग को इन्स्तांत करने का कोई तरीका है? IOS – स्केल और फ़सल CMSampleBufferRef / CVImageBufferRef सर्वर साइड स्क्रिप्ट के बिना जावास्क्रिप्ट में समान मूल नीति के आसपास हो रही है जावा में कस्टम अपवाद वर्ग को परिभाषित कैसे करें, सबसे आसान तरीका है? सी # में बेनामी विधि की सदस्यता रद्द करें GetExternalFilesDir और getExternalStorage डायरेक्टरी के बीच अंतर () सशर्त शामिल करने के लिए लिंक्स में संस्थाओं? सीडी में लिनक्स पर स्टड-आउट धागा सुरक्षित? जावा में, जब मैं OutputStream.close कॉल करता हूं () मुझे पहले OutputStream.flush () कॉल करने की ज़रूरत है? SQL सर्वर में एक-से-एक रिश्ते को परिभाषित करना

विंडोज संदेशों में हुक सेट करना

मैं एक ऐसा आवेदन करने की कोशिश कर रहा हूं जो वर्तमान में चलने वाले ट्रैक का नाम और कलाकार को उपयोगकर्ता को सूचित करेगा जिसके लिए मुझे track change event पर नजर रखने की आवश्यकता है।

मैंने Winspector इस्तेमाल किया और पता चला कि जब भी Spotify WM_SETTEXT संदेश में कोई ट्रैक परिवर्तन होता है, भेजते हैं।

यहां छवि विवरण दर्ज करें

इसके लिए मुझे विश्वास है कि दूसरे एप्लिकेशन द्वारा भेजे गए WM_SETTEXT संदेश देखने के लिए WM_SETTEXT अपने आवेदन के माध्यम से एक HOOK सेट करना होगा।

अब, मैं जो समस्या का सामना कर रहा हूं I के साथ काम करने के लिए कोई काम करने वाला नमूना कोड प्राप्त करने में सक्षम नहीं है। मैंने सेटविंडोहेक्क्स के प्रलेखन को पढ़ा और कुछ गोगलिंग भी किए, लेकिन वास्तव में खो गया क्योंकि मेरे पास सी # की कोई पृष्ठभूमि नहीं है और खिड़कियां संदेश / ईवेंट संभालने के लिए।

इसलिए, यदि आप मुझे एक छोटे से काम कोड दे सकते हैं तो मुझे एक और आवेदन पर setting up hook करने के लिए मेरे सिर को लपेटने के लिए या यदि आप इसे प्राप्त करने के बारे में कुछ अच्छे लेख के लिए मुझे निर्देशित कर सकते हैं

वेब के समाधान से एकत्रित समाधान "विंडोज संदेशों में हुक सेट करना"

यहां एक अलग दृष्टिकोण है: SetWindowsHook API को छोड़ दें, और इसके बजाय WinEvents का उपयोग करें , जो इसके बजाय SetWinEventHook का उपयोग करते हैं यह कुछ हद तक खिड़कियां हुक के समान है, इसमें दोनों एक कॉलबैक फ़ंक्शन शामिल है जिसे विशिष्ट घटनाओं में कहा जाता है, लेकिन WinEvents सी # से उपयोग करना आसान है: आप विशिष्ट कर सकते हैं कि WinEvents "बाह्य संदर्भ" वितरित किए जाते हैं, जिसका मतलब है कि ईवेंट पोस्ट किए गए हैं वापस अपनी स्वयं की प्रक्रिया में है, इसलिए आपको अलग डीएलएल की आवश्यकता नहीं है। (हालांकि, आपके कोड को उसी थ्रेड पर एक संदेश लूप चलाने की आवश्यकता है जिसे सेटवेनएवेंटहेक कहा जाता है।)

यह पता चला है कि WinEvent का समर्थन करने वाले एक प्रकार के ईवेंट में एक 'नाम परिवर्तन' ईवेंट होता है, जो स्वतः USER32 द्वारा निकाल दिया जाता है, जब भी एचडब्ल्यूडब्ल्यूएनडी का शीर्षक पाठ बदल जाता है, जो लगता है कि आप क्या चाहते हैं। (WinEvents का उपयोग फोकस परिवर्तनों और विभिन्न प्रकार के राज्य परिवर्तनों को ट्रैक करने के लिए भी किया जा सकता है; अधिक जानकारी के लिए एमएसडीएन देखें।) यह भी अन्य नियंत्रणों से निकाल दिया जाता है जब उनके आंतरिक यूआई में परिवर्तन होता है – उदाहरण के लिए सूचीबॉक्स द्वारा जब सूची आइटम का टेक्स्ट बदलता है, तो हमें कुछ फ़िल्टरिंग करना है

यहां कुछ नमूना कोड है जो डेस्कटॉप पर किसी भी एचडब्ल्यूएनडी पर शीर्षक परिवर्तनों को प्रिंट करता है – आप देखेंगे कि यह एक सूचना को टास्कबार परिवर्तनों पर घड़ी में पाठ के रूप में प्रिंट करता है, उदाहरण के लिए। आप इस कोड को केवल एचडब्ल्यूएनडी के लिए फ़िल्टर करने के लिए संशोधित करना चाहेंगे, जो आप Spotify में ट्रैकिंग कर रहे हैं इसके अलावा, यह कोड सभी प्रक्रियाओं / थ्रेडों पर नाम परिवर्तनों को सुनता है; आपको GetWindowThreadProcessId का उपयोग करते हुए लक्ष्य HWND से threadID प्राप्त करना चाहिए और केवल उस थ्रेड से ईवेंट सुनें।

यह भी ध्यान दें कि यह एक नाजुक दृष्टिकोण है; यदि स्पॉटिफ में परिवर्तन यह पाठ प्रदर्शित करता है, या इसके प्रारूप को बदलता है, तो आपको इसके परिवर्तनों को बनाए रखने के लिए अपने कोड को संशोधित करने की आवश्यकता होगी

 using System; using System.Windows; using System.Windows.Forms; using System.Runtime.InteropServices; class NameChangeTracker { delegate void WinEventDelegate(IntPtr hWinEventHook, uint eventType, IntPtr hwnd, int idObject, int idChild, uint dwEventThread, uint dwmsEventTime); [DllImport("user32.dll")] static extern IntPtr SetWinEventHook(uint eventMin, uint eventMax, IntPtr hmodWinEventProc, WinEventDelegate lpfnWinEventProc, uint idProcess, uint idThread, uint dwFlags); [DllImport("user32.dll")] static extern bool UnhookWinEvent(IntPtr hWinEventHook); const uint EVENT_OBJECT_NAMECHANGE = 0x800C; const uint WINEVENT_OUTOFCONTEXT = 0; // Need to ensure delegate is not collected while we're using it, // storing it in a class field is simplest way to do this. static WinEventDelegate procDelegate = new WinEventDelegate(WinEventProc); public static void Main() { // Listen for name change changes across all processes/threads on current desktop... IntPtr hhook = SetWinEventHook(EVENT_OBJECT_NAMECHANGE, EVENT_OBJECT_NAMECHANGE, IntPtr.Zero, procDelegate, 0, 0, WINEVENT_OUTOFCONTEXT); // MessageBox provides the necessary mesage loop that SetWinEventHook requires. // In real-world code, use a regular message loop (GetMessage/TranslateMessage/ // DispatchMessage etc or equivalent.) MessageBox.Show("Tracking name changes on HWNDs, close message box to exit."); UnhookWinEvent(hhook); } static void WinEventProc(IntPtr hWinEventHook, uint eventType, IntPtr hwnd, int idObject, int idChild, uint dwEventThread, uint dwmsEventTime) { // filter out non-HWND namechanges... (eg. items within a listbox) if(idObject != 0 || idChild != 0) { return; } Console.WriteLine("Text of hwnd changed {0:x8}", hwnd.ToInt32()); } } 

आप अपने मुख्य प्रपत्र में WndProc को ओवरराइड करने का प्रयास कर सकते हैं, ऐसा कुछ:

 protected override void WndProc(ref Message m) { base.WndProc(ref m); if (m.Msg == WM_SETTEXT) { // Call to your logic here } } 

SetWindowHookEx का उपयोग करने के तरीके के बारे में सलाह के लिए, देखें SO 214022 प्रश्न सी # में कोड काम करने के लिए देखें SO प्रश्न 1811383

सामान्य तौर पर, यदि आप सी # से WinAPI फ़ंक्शन का उपयोग करना चाहते हैं, तो आपको एक प्लेटफार्म इनोक कॉल (लघु PInvoke ) करना होगा। pinvoke.net आपके स्रोत coede की जरूरत है कि करने के लिए हस्ताक्षर पर एक अच्छा संसाधन है, लेकिन यह पहले से ही प्रश्न 1811383 में शामिल किया गया है।

चूंकि मुझे पूरी विंडोज मैसेजिंग कतार को कभी नहीं समझा गया था, इसलिए मुझे नहीं पता कि संदेश जबालु द्वारा प्रस्तावित किया गया है, जब संदेश एक अलग प्रक्रिया में शुरू होगा। लेकिन मुझे यहां कुछ उदाहरण कोड मिला: http://en.serialcoder.net/Winforms/527/533/Interoperability%20Win32/How%20can%20I%20use%20%20Hooks%20%20in%20.NET.aspx आशा यह सहायता करता है।