Per un'applicazione WPF, esiste internamente un classico loop di messaggi (nel senso di Windows GetMessage/DispatchMessage
) all'interno di Application.Run
? È possibile rilevare un messaggio pubblicato da un'altra applicazione Win32 con PostThreadMessage in un thread UI WPF (un messaggio senza handle HWND). Grazie.WPF application loop e PostThreadMessage
6
A
risposta
3
Ho utilizzato .NET Reflector per tracciare l'implementazione Applicaton.Run
fino a Dispatcher.PushFrameImpl
. È anche possibile ottenere le stesse informazioni da .NET Framework reference sources. V'è infatti un ciclo di messaggi classico:
private void PushFrameImpl(DispatcherFrame frame)
{
SynchronizationContext syncContext = null;
SynchronizationContext current = null;
MSG msg = new MSG();
this._frameDepth++;
try
{
current = SynchronizationContext.Current;
syncContext = new DispatcherSynchronizationContext(this);
SynchronizationContext.SetSynchronizationContext(syncContext);
try
{
while (frame.Continue)
{
if (!this.GetMessage(ref msg, IntPtr.Zero, 0, 0))
{
break;
}
this.TranslateAndDispatchMessage(ref msg);
}
if ((this._frameDepth == 1) && this._hasShutdownStarted)
{
this.ShutdownImpl();
}
}
finally
{
SynchronizationContext.SetSynchronizationContext(current);
}
}
finally
{
this._frameDepth--;
if (this._frameDepth == 0)
{
this._exitAllFrames = false;
}
}
}
Inoltre, ecco l'implementazione di TranslateAndDispatchMessage
, che spara davvero ComponentDispatcher.ThreadFilterMessage evento lungo il suo corso di esecuzione all'interno RaiseThreadMessage
:
private void TranslateAndDispatchMessage(ref MSG msg)
{
if (!ComponentDispatcher.RaiseThreadMessage(ref msg))
{
UnsafeNativeMethods.TranslateMessage(ref msg);
UnsafeNativeMethods.DispatchMessage(ref msg);
}
}
A quanto pare, funziona per qualsiasi postato messaggio, non solo quelli di tastiera. Dovresti essere in grado di iscriverti allo ComponentDispatcher.ThreadFilterMessage
e guardare il tuo messaggio di interesse.
Problemi correlati
- 1. Differenza tra Application Manager e Application Master in YARN?
- 2. Cosa significa "Enable Application Framework" per un'applicazione WPF?
- 3. Tasto Set Size al contenuto Dimensione in WPF Application
- 4. Windows System Tray Application
- 5. Accedere all'oggetto Application all'interno di una classe Window in WPF?
- 6. JEE6 @Application Bean e concorrentopropato
- 7. Enterprise Library Validation Application Block e Internazionalizzazione
- 8. Come-a che fare con l'autenticazione WCF per entrambi Silverlight 4 e WPF Application
- 9. Foreach loop e compiti
- 10. loop e mezzo controllato
- 11. Tubazioni e loop Linux
- 12. Loop svolgimento e l'ottimizzazione
- 13. Application Insights
- 14. Model-View-Presenter e Android Application Design
- 15. Mocking HttpRequest e HttpResponse per MVC Application
- 16. Python autonomo web application e server?
- 17. Generatori e loop in Python
- 18. Puntatori e loop in C
- 19. While Loop e condizioni multiple
- 20. mysqli_query, mysqli_fetch_array e while loop
- 21. Asyncore loop e raw_input problem
- 22. Application Release/Upgrade Strategy per Silverlight Business Application?
- 23. Tiggr vs Application Craft
- 24. Cocoa Application Bootstrap Domande
- 25. Ninject with Windows Application
- 26. Hacking your own application
- 27. RMarkdown in Shiny Application
- 28. Application sticks on OSSpinLockLockSlow
- 29. Spark Kill Running Application
- 30. Auto update java application
Potrebbe essere possibile guardare un messaggio specifico con l'evento [ComponentDispatcher.ThreadFilterMessage] (http://msdn.microsoft.com/en-us/library/system.windows.interop.componentdispatcher.threadfiltermessage.aspx), anche se i documenti dicono che è inteso per i messaggi della tastiera. Ecco una domanda correlata [risposta] (http://stackoverflow.com/questions/476084/c-sharp-twain-interaction). – Noseratio