यदि आपको WinForms का संदर्भ देने में कोई फर्क नहीं पड़ता है, तो आप एक और एमवीवीएम-उन्मुख समाधान का उपयोग कर सकते हैं जो दृश्य के साथ जोड़े की सेवा नहीं करता है। आपको System.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;
}
}
उपयोग SpongeHandle में आपकी रुचि है संदेशों के लिए रजिस्टर करने के लिए और उसके बाद ओवरराइड WndProc उन्हें कार्रवाई करने के लिए:
public class WindowsMessageListenerService : WinApiServiceBase
{
protected override void WndProc(Message message)
{
Debug.WriteLine(message.msg);
}
}
केवल नकारात्मक पक्ष यह है आप System.Windows.Forms संदर्भ शामिल करने के लिए है कि है, लेकिन अन्यथा यह एक बहुत ही encapsulated समाधान है।
अधिक इस पर here पढ़ा जा सकता है
स्रोत
2017-02-02 17:08:23
ठीक है, यूएसबी डिवाइस (डी) कनेक्ट घटनाएं इस संदेश लूप पर आ रही हैं, इसलिए यह जानना एक बुरी चीज नहीं है कि WPF – flq
@Noldorin से कैसे जुड़ा हुआ है: क्या आप कृपया संदर्भ (लेख/पुस्तकें) प्रदान कर सकते हैं जो मदद कर सकते हैं मैं भाग को समझता हूं "डिजाइन विचारधारा और एपीआई की प्रकृति WinForms से WPF में बहुत अलग है, ... WndProc के बराबर क्यों नहीं है"? उदाहरण के लिए – atiyar
'WM_MOUSEWHEEL', उन संदेशों को विश्वसनीय रूप से फंसाने का एकमात्र तरीका' डब्लूएनडीपीआरसी 'को एक डब्ल्यूपीएफ विंडो में जोड़कर था। यह मेरे लिए काम करता था, जबकि आधिकारिक 'MouseWheelEventHandler' बस अपेक्षा के अनुसार काम नहीं करता था। मैं 'डब्ल्यूडब्ल्यूपीआरओआर' के लिए सीधे पहुंच के लिए सही व्यवहार करने के लिए सही सही डब्ल्यूपीएफ टैचियन प्राप्त करने में असमर्थ था। –