Wenn es Ihnen nichts ausmacht, auf WinForms zu verweisen, können Sie eine MVVM-orientierte Lösung verwenden, die den Dienst nicht mit der Ansicht koppelt. Sie müssen ein System.Windows.Forms.NativeWindow erstellen und initialisieren, das ein kleines Fenster ist, das Nachrichten empfangen kann.
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;
}
}
Verwenden SpongeHandle für Nachrichten registrieren Sie interessiert sind und dann außer Kraft setzen WndProc sie zu verarbeiten:
public class WindowsMessageListenerService : WinApiServiceBase
{
protected override void WndProc(Message message)
{
Debug.WriteLine(message.msg);
}
}
Der einzige Nachteil ist, dass Sie System.Windows.Forms Referenz enthalten müssen, aber Ansonsten ist dies eine sehr gekapselte Lösung.
auf dieses Mehr kann here lesen
Nun, USB Device (dis) connect Ereignisse scheinen über diese Nachrichtenschleife zu kommen, also ist es keine schlechte Sache zu wissen, wie man WPF verbindet – flq
@Noldorin: Können Sie bitte Referenzen (Artikel/Bücher) zur Verfügung stellen, die helfen können Ich verstehe den Teil "Die Design-Ideologie und die Art der API ist sehr unterschiedlich in WPF von WinForms, ... warum gibt es kein Äquivalent von WndProc"? – atiyar
'WM_MOUSEWHEEL' zum Beispiel, der einzige Weg, um diese Nachrichten zuverlässig zu fangen, war durch Hinzufügen der' WndProc' zu einem WPF-Fenster. Das funktionierte für mich, während der offizielle 'MouseWheelEventHandler' einfach nicht wie erwartet funktionierte. Ich war nicht in der Lage, die richtigen WPF-Tachyonen richtig aufgereiht zu bekommen, um zuverlässiges Verhalten mit "MouseWheelEventHandler" zu bekommen, daher die Notwendigkeit eines direkten Zugriffs auf den "WndProc". –