Nachricht senden in C#
Ich bin erstellen einer Anwendung verwendet, die eine Haupt-Projekt, das angeschlossen ist, um mehrere verschiedene DLLs. Von einer DLL-Fenster muss ich in der Lage sein, ein Fenster zu öffnen, in einem anderen aber die DLL ' s können nicht aufeinander verweisen.
Es wurde mir vorgeschlagen, verwenden Sie die sendmessage-Funktion in der ersten DLL und haben einen listener im Haupt-Programm, das leitet die Nachricht an die entsprechende DLL zu öffnen Fenster.
Aber ich bin überhaupt nicht vertraut mit der sendmessage-Funktion und habe eine Menge Schwierigkeitsgrad Ansetzer Dinge zusammen aus Informationen, die ich zu finden bin online.
Wenn könnte jemand bitte zeigen Sie mir den richtigen Weg (wenn es welche gibt) verwenden Sie die sendmessage-Funktion und vielleicht, wie ein Zuhörer fängt die Nachricht, das wäre toll. Hier ist der code habe ich so weit ich bin mir nicht sicher, ob ich in die richtige Richtung.
[DllImport("user32.dll")]
public static extern int FindWindow(string lpClassName, String lpWindowName);
[DllImport("user32.dll")]
public static extern int SendMessage(IntPtr hWnd, int wMsg, IntPtr wParam, IntPtr lParam);
public void button1_Click(object sender, EventArgs e)
{
int WindowToFind = FindWindow(null, "Form1");
}
Wenn Sie haben die Kontrolle über die Anwendung, verwenden einige andere IPC-Strategie ( named pipe/socket )
InformationsquelleAutor Nicole | 2011-02-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
Brauchen Sie nicht, um Nachrichten zu senden.
Hinzufügen eines event, um eine form und eine Ereignisprozedur zu den anderen. Dann können Sie mit einem Dritten Projekt, der auf die anderen beiden zu befestigen, der event-handler für das Ereignis. Die beiden DLLs müssen nicht aufeinander verweisen, für diese zu arbeiten.
InformationsquelleAutor Mark Byers
Um das Fenster müssen Sie den Namen der Klasse des Fensters. Hier sind einige Beispiele:
C#:
Beispiel aus einem Programm, das ich gemacht habe, geschrieben in VB:
Um den Klassennamen eines Fensters, müssen Sie etwas namens Win-Spy
Sobald Sie das handle des Fensters, können Sie Nachrichten senden, um es mithilfe der SendMessage(IntPtr hWnd, int wMsg, IntPtr wParam, IntPtr lParam) - Funktion.
hWnd, hier ist das Ergebnis der Funktion FindWindow. In der obigen Beispiele, diese werden hwnd und hParent. Es erzählt die SendMessage-Funktion, die das Fenster, um die Nachricht zu senden.
Den zweiten parameter wMsg, ist eine Konstante, die bedeutet, die TYP der Nachricht, die Sie senden. Die Nachricht könnte eine Tastenkombination (z.B. senden "enter-Taste" oder die "Leertaste", um ein Fenster), aber es könnte auch ein Befehl um das Fenster zu schließen (WM_CLOSE), einen Befehl zum ändern der Fenster (hide it, show it, minimieren ändern, den Titel, usw.), eine Anfrage für Informationen in dem Fenster angezeigt wird (immer der Titel, der erste text in einem Textfeld, etc.), und so weiter. Einige typische Beispiele sind die folgenden:
Diese können gefunden werden mit einem API-viewer (oder einem einfachen text-editor wie notepad) durch die öffnung (Microsoft Visual Studio-Verzeichnis)/Common/Tools/WINAPI/winapi32.txt.
Den nächsten zwei Parameter sind bestimmte details, wenn Sie nötig sind. In Bezug auf drücken bestimmter Tasten, werden Sie genau angeben, welche bestimmte Taste gedrückt werden.
C# - Beispiel wird der text "windowHandle" mit WM_SETTEXT:
Weitere Beispiele aus einem Programm, das ich gemacht habe, geschrieben in VB, Einstellung einer Programm-icon (ICONBIG ist eine Konstante, die gefunden werden können in winapi32.txt):
Weiteres Beispiel von VB, drücken Sie die space-Taste (VK_SPACE ist eine Konstante, die gefunden werden können in winapi32.txt):
VB Versand klicken auf eine Schaltfläche (button Links unten und dann nach oben):
Keine Ahnung, wie man die Zuhörer in einem .DLL, aber diese Beispiele sollten helfen, zu verstehen, wie die Nachricht zu senden.
InformationsquelleAutor TimFoolery
Sind Sie fast da. (Hinweis: ändern Sie in der Rückgabewert von FindWindow Erklärung). Ich würde empfehlen, mit RegisterWindowMessage in diesem Fall, so dass Sie nicht haben, um sorgen über die ins und outs der WM_USER.
Und dann in deine Form1-Klasse:
Bedenken habe ich nicht kompiliert, alle der oben genannten, so dass einige Anpassungen notwendig sein können.
Auch Bedenken, dass die anderen Antworten warn Sie Weg von
SendMessage
sind vor Ort auf. Es ist nicht die bevorzugte Art, inter-Modul-Kommunikation heute und genrally sprechen überschreiben derWndProc
und mitSendMessage/PostMessage
impliziert ein gutes Verständnis davon, wie die Win32-message-Infrastruktur funktioniert.Aber wenn Sie wollen/müssen diesen Weg gehen, ich denke, die oben erhalten Sie gehen in die richtige Richtung.
InformationsquelleAutor dkackman
Es klingt nicht wie eine gute Idee, verwenden Sie die Nachricht senden. Ich denke, Sie sollten versuchen, um das problem zu umgehen, dass die DLLs können nicht aufeinander verweisen...
InformationsquelleAutor Daniel Hilgarth
Einige andere Optionen:
Gemeinsamen Versammlung
Erstellen Sie eine andere assembly zu, hat einige gemeinsame Schnittstellen, die implementiert werden können, indem Sie die Assemblys.
Reflexion
Dieser hat alle möglichen Warnungen und Nachteile, aber man könnte reflection instanziieren /kommunizieren mit den Formen. Dies ist sowohl langsam und Laufzeit dynamische (nicht statische überprüfung dieser code zur compile-Zeit).
InformationsquelleAutor RQDQ
Gebäude auf Mark Byers Antwort.
Dem 3. Projekt könnte ein WCF-Projekt, gehostet als Windows-Dienst. Wenn alle Programme lauschte, der service, eine Anwendung, die den service rufen. Der service leitet die Nachricht an alle Kunden hören und Sie können eine Aktion durchzuführen, wenn geeignet.
Gute WCF-videos hier - http://msdn.microsoft.com/en-us/netframework/dd728059
InformationsquelleAutor JonWillis