Ich möchte einige SAPI-Nachrichten von einer DLL, die eine Art Plugin ist, behandeln. Wie behandelt man Nachrichten/Ereignisse in einer VC++ - DLL? Die SAPI-Ereignisbehandlung wird im Beispiel angezeigt unter: http://msdn.microsoft.com/en-us/library/ms720165%28VS.85%29.aspxWie Verwenden von WndProc von einer C++ - DLL?
Antwort
Um "normale" Nachrichten zu verarbeiten, benötigen Sie immer noch ein Window-Objekt. Dies kann ein spezielles Nur-Nachrichten-Fenster sein, das nur die Nachrichtenwarteschlangeninfrastruktur mit normalen Fenstern teilt. Um es zu erstellen, registrieren Sie zuerst Ihre Nachrichtenbehandlungsklasse mit RegisterClass()
. Erstellen Sie als Nächstes eine Nachrichtenwarteschlange, indem Sie HWND_MESSAGE
als übergeordnetes Fenster an CreateWindow()
übergeben. Sie erhalten dann eine HWND zurück, die Sie dann zu SAPI bringen können.
SAPI unterstützt jedoch auch andere Schnittstellen. Die ISpNotifySource-Dokumentationsnamen 4: Windows-Nachrichten, Callbacks, Ereignisse und COM (ISpNotifySink). Um Callbacks zu verwenden, übergeben Sie einfach die Adresse einer Ihrer DLL-Methoden an SetNotifyCallbackFunction
.
WndProc wird verwendet, um alle Nachrichten/Ereignisse zu empfangen, die an ein Fenster gerichtet sind.
Ihre DLL sollte ein Fenster erstellen und auf Nachrichten im Fenster warten. Wenn möglich, sollten Sie dies in Ihrem Hauptprozess implementieren, oder Sie können die DLL einen separaten Thread erstellen lassen, der das Fenster erstellt und auf die Nachricht wartet, während die eigentliche Funktion die Kontrolle an den Prozess zurückgibt.
Wenn Ihr Code als Plugin ausgeführt wird, möchten Sie vielleicht sehen, dass SAPI Sie direkt zurückrufen wird, indem Sie ISpNotifySource::SetNotifyCallbackFunction anstelle von ISpNotifySource::SetNotifyWindowMessage verwenden. SAPI wird dann Ihre Funktion direkt aufrufen, wenn ein Ereignis eintritt.
Bereits von MSalters erzählt –
Erstellen eines Fensters ist nicht möglich in einem Plugin, funktioniert ein unsichtbares Fenster und dann wie das WndProc in der DLL zu verwenden, jedes Beispiel –
Ein unsichtbares Fenster Ereignisse zu empfangen ist unmöglich, soweit ich weiß. – Sahas
Definitiv möglich. – MSalters