दिलचस्प पोस्ट
प्रोजेक्ट यूलर प्रश्न 14 (कोलेत्स समस्या) कैसे foreach loops सी # में काम करते हैं? चर लंबाई की एक स्ट्रिंग बनाएं, दोहराए गए अक्षर से भरी jQuery.ajax विफल रहता है जब यूआरएल अलग सर्वर से है मैं गलत गिट धक्का -f मूल मास्टर से कैसे पुनर्प्राप्त कर सकता हूं? यह चल रहा है, जबकि SetInterval के अंतराल को बदलने ऐप्लीकेशन में एएसपी.नेट असेंबलियों को जीवित कैसे रखना है? आवरण का उपयोग करते समय, प्रवेश करने के लिए Log4Net के लिए कक्षा और विधि का नाम कैसे संरक्षित किया जाए? जावा: System.console से इनपुट कैसे प्राप्त करें () आईओएस 8 रोटेशन मेथड अपेशन – पश्चगामी संगतता ईएफ 4.1 – कोड प्रथम – JSON परिपत्र संदर्भ सीरियलाइज़ेशन त्रुटि jquery फार्म सबमिट करें और फिर एक मौजूदा div में परिणाम दिखाएं एंड्रॉइड पर मैं कैसे 3 जी / डाटा प्रोग्रामेटिक रूप से बंद कर सकता हूं? एक java.util.Calendar / Date के लिए TIMEZONE को बदलने के लिए रीडटाइम में उपप्रोसेस से स्टडआउट को पकड़ना

WPF में WndProc संदेशों को कैसे संभालना है?

डब्ल्यूपीएफ को सीखने की एक तेजी

अच्छा 'ओएल विंडोज फॉर्म में, मैं सिर्फ WndProc ओवरराइड था, और वे में आया के रूप में संदेशों को संभालने शुरू।

क्या कोई मुझे इस बात का एक उदाहरण बता सकता है कि WPF में एक ही चीज़ कैसे प्राप्त करें?

वेब के समाधान से एकत्रित समाधान "WPF में WndProc संदेशों को कैसे संभालना है?"

दरअसल, जहां तक ​​मैं समझता हूं कि वास्तव में WPF HwndSource और HwndSourceHook का इस्तेमाल करते हैं, वास्तव में यह संभव है। एक उदाहरण के रूप में एमएसडीएन पर यह धागा देखें। (नीचे सूचीबद्ध प्रासंगिक कोड)

 // 'this' is a Window HwndSource source = HwndSource.FromHwnd(new WindowInteropHelper(this).Handle); source.AddHook(new HwndSourceHook(WndProc)); private static IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) { // do stuff return IntPtr.Zero; } 

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

आप इसे System.Windows.Interop नामस्थान के माध्यम से कर सकते हैं जिसमें HwndSource नामक एक वर्ग शामिल है।

इसका उपयोग करने का उदाहरण

 using System; using System.Windows; using System.Windows.Interop; namespace WpfApplication1 { public partial class Window1 : Window { public Window1() { InitializeComponent(); } protected override void OnSourceInitialized(EventArgs e) { base.OnSourceInitialized(e); HwndSource source = PresentationSource.FromVisual(this) as HwndSource; source.AddHook(WndProc); } private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) { // Handle messages... return IntPtr.Zero; } } } 

उत्कृष्ट ब्लॉग पोस्ट से पूरी तरह से लिया गया: स्टीव रैंड्स द्वारा WPF ऐप्स में कस्टम WndProc का उपयोग करना (नोट, लिंक अब मान्य नहीं है)

यह साइट अब नीचे है लेकिन आप इसे वेबैक इंजन से देख सकते हैं: http://web.archive.org/web/20091019124817/http://www.steverands.com/2009/03/19/custom-wndproc-wpf -Apps /

 HwndSource src = HwndSource.FromHwnd(new WindowInteropHelper(this).Handle); src.AddHook(new HwndSourceHook(WndProc)); ....... public IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) { if(msg == THEMESSAGEIMLOOKINGFOR) { //Do something here } return IntPtr.Zero; } 

आप यहां WndProc को संलग्न करने के लिए एक और स्पष्टीकरण पा सकते हैं।

WPF में WNDProc (जैसे HwndSource, आदि का उपयोग कर) के साथ संदेशों को संभाल करने के तरीके हैं, लेकिन आम तौर पर उन तकनीकों को संदेश के साथ इंटरॉप के लिए आरक्षित किया जाता है जो सीधे WPF के माध्यम से नियंत्रित नहीं हो सकते। अधिकांश WPF नियंत्रण Win32 (और विस्तार से Windows.Forms) अर्थ में खिड़कियां भी नहीं हैं, इसलिए वे WndProcs नहीं होगा।

आप अंतर्निहित Win32 वर्ग के 'SystemEvents' वर्ग से संलग्न कर सकते हैं:

 using Microsoft.Win32; 

एक WPF विंडो कक्षा में:

 SystemEvents.PowerModeChanged += SystemEvents_PowerModeChanged; SystemEvents.SessionSwitch += SystemEvents_SessionSwitch; SystemEvents.SessionEnding += SystemEvents_SessionEnding; SystemEvents.SessionEnded += SystemEvents_SessionEnded; private async void SystemEvents_PowerModeChanged(object sender, PowerModeChangedEventArgs e) { await vm.PowerModeChanged(e.Mode); } private async void SystemEvents_PowerModeChanged(object sender, PowerModeChangedEventArgs e) { await vm.PowerModeChanged(e.Mode); } private async void SystemEvents_SessionSwitch(object sender, SessionSwitchEventArgs e) { await vm.SessionSwitch(e.Reason); } private async void SystemEvents_SessionEnding(object sender, SessionEndingEventArgs e) { if (e.Reason == SessionEndReasons.Logoff) { await vm.UserLogoff(); } } private async void SystemEvents_SessionEnded(object sender, SessionEndedEventArgs e) { if (e.Reason == SessionEndReasons.Logoff) { await vm.UserLogoff(); } } 

यदि आप WinForms को संदर्भित करने में कोई दिक्कत नहीं करते हैं, तो आप एक अधिक MVVM- उन्मुख समाधान का उपयोग कर सकते हैं जो व्यू से सेवा नहीं दिखाता। आपको एक सिस्टम बनाने और आरंभ करने की आवश्यकता है। Windows.Forms.NativeWindow जो एक हल्के खिड़की है जो संदेश प्राप्त कर सकता है

 public abstract class WinApiServiceBase : IDisposable { /// <summary> /// Sponge window absorbs messages and lets other services use them /// </summary> private sealed class SpongeWindow : NativeWindow { public event EventHandler<Message> WndProced; public SpongeWindow() { CreateHandle(new CreateParams()); } protected override void WndProc(ref Message m) { WndProced?.Invoke(this, m); base.WndProc(ref m); } } private static readonly SpongeWindow Sponge; protected static readonly IntPtr SpongeHandle; static WinApiServiceBase() { Sponge = new SpongeWindow(); SpongeHandle = Sponge.Handle; } protected WinApiServiceBase() { Sponge.WndProced += LocalWndProced; } private void LocalWndProced(object sender, Message message) { WndProc(message); } /// <summary> /// Override to process windows messages /// </summary> protected virtual void WndProc(Message message) { } public virtual void Dispose() { Sponge.WndProced -= LocalWndProced; } } 

उन संदेशों के लिए रजिस्टर करने के लिए स्पानहैण्डल का उपयोग करें, जिन्हें आप रुचि रखते हैं और फिर उन्हें प्रोसेस करने के लिए WndProc ओवरराइड करें:

 public class WindowsMessageListenerService : WinApiServiceBase { protected override void WndProc(Message message) { Debug.WriteLine(message.msg); } } 

केवल नकारात्मक पक्ष यह है कि आपको सिस्टम को शामिल करना होगा। विन्डोज.फ़ॉर्मेंस संदर्भ, लेकिन अन्यथा यह एक बहुत समझाया समाधान है।

इस पर अधिक पढ़ा जा सकता है यहां

WPF WinForms प्रकार wndprocs पर काम नहीं करता है

आप एचडब्ल्यूडीएचओस्ट को एक उपयुक्त WPF तत्व में होस्ट कर सकते हैं, फिर एचडवार्डहोस्ट के wndproc को ओवरराइड कर सकते हैं, लेकिन एएएएआईके जो आप जितना पास हो सके

http://msdn.microsoft.com/en-us/library/ms742522.aspx

http://blogs.msdn.com/nickkramer/archive/2006/03/18/554235.aspx

संक्षिप्त जवाब है कि आप नहीं कर सकते WNDProc एक Win32 स्तर पर एक HWND संदेश भेज कर काम करता है WPF विंडो में कोई एचडब्ल्यूएनडी नहीं है और इसलिए WndProc संदेशों में भाग नहीं ले सकता। आधार WPF संदेश पाश WndProc के शीर्ष पर बैठता है, लेकिन यह उन्हें मूल WPF तर्क से दूर सार।

आप एक एचडब्ल्यूडीएचओएचएच का उपयोग कर सकते हैं और इसके लिए डब्ल्यूडीआरपीसी पर मिल सकते हैं। हालांकि यह लगभग निश्चित रूप से नहीं है कि आप क्या करना चाहते हैं। अधिकांश प्रयोजनों के लिए, WPF एचडब्ल्यूएनडी और डब्ल्यूडीपीआरसी पर काम नहीं करता है। आपका समाधान लगभग निश्चित रूप से डब्ल्यूडीपीआरसी में नहीं WPF में परिवर्तन करने पर निर्भर करता है