Se non ti interessa fare riferimento a WinForms, puoi utilizzare una soluzione MVVM più orientata che non accoppi il servizio alla vista. È necessario creare e inizializzare System.Windows.Forms.NativeWindow che è una finestra leggera che può ricevere messaggi.
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;
}
}
Usa SpongeHandle di registrarsi per i messaggi che ti interessa e poi ignorare WndProc al loro trattamento:
public class WindowsMessageListenerService : WinApiServiceBase
{
protected override void WndProc(Message message)
{
Debug.WriteLine(message.msg);
}
}
L'unico inconveniente è che bisogna includere System.Windows.Forms di riferimento, ma altrimenti questa è una soluzione molto incapsulata.
Maggiori informazioni su questo possono essere letti here
fonte
2017-02-02 17:08:23
Bene, gli eventi USB Device (dis) connect sembrano arrivare su questo loop di messaggi, quindi non è una brutta cosa sapere come collegarsi da WPF – flq
@Noldorin: Puoi fornire riferimenti (articoli/libri) che possono aiutare capisco la parte "L'ideologia del design e la natura dell'API sono molto diverse in WPF da WinForms, ... perché non esiste un equivalente di WndProc"? – atiyar
'WM_MOUSEWHEEL', ad esempio, l'unico modo per intercettare in modo affidabile quei messaggi è stato aggiungendo il' WndProc' a una finestra WPF. Questo ha funzionato per me, mentre il 'MouseWheelEventHandler' ufficiale semplicemente non funzionava come previsto. Non ero in grado di ottenere il giusto numero di tachioni WPF allineati per ottenere un comportamento affidabile con 'MouseWheelEventHandler', da qui la necessità di accedere direttamente a' WndProc'. –