Mit folgender Klasse ist es möglich, spezif. Windows-Messages an ein Fenster zu senden. Die Auswertung von Messages innerhalb eigener Anwendungen ist in folgendem Artikel beschrieben: Link
- Aufruf-Beispiel:
CAppCtrlObj wc = new CAppCtrlObj(); // Fenster-Handle eines geöffneten, leeren Notepad.exe-Fensters holen IntPtr hWnd = wc.GetWindowHandle("Unbenannt - Editor", null); if ((int)hWnd != 0) { // an das gefundene Fenster eine Schließen-Message (WM_CLOSE) schicken, auf Ausführung warten IntPtr err = wc.SendMessageToWindow(hWnd, CAppCtrlObj.WM_CLOSE, IntPtr.Zero, IntPtr.Zero); if ((int)err != 0) { // Fehler beim Schließen } } oder IntPtr hWnd = wc.GetWindowHandle("Unbenannt - Editor", null); if ((int)hWnd != 0) { // an das gefundene Fenster eine Schließen-Message (WM_CLOSE) schicken, nicht auf Ausführung warten if (wc.PostMessageToWindow(hWnd, CAppCtrlObj.WM_CLOSE, IntPtr.Zero, IntPtr.Zero)) { // wenn ok } }
- Klasse:
public class CAppCtrlObj { #region Message-Konstanten aus der Windows.h public const int WM_CLOSE = 0x10; #endregion #region Importfunktionen aus User32.dll // http://www.pinvoke.net/default.aspx/user32.FindWindow [DllImport("user32", CharSet = CharSet.Auto, SetLastError = true)] private static extern IntPtr FindWindow(string lpClassName, string lpWindowName); // http://www.pinvoke.net/default.aspx/user32.SendMessage [DllImport("user32", CharSet = CharSet.Auto, SetLastError = true)] private static extern IntPtr SendMessage(IntPtr hWnd, uint uiMsg, IntPtr wParam, IntPtr lParam); // http://www.pinvoke.net/default.aspx/user32.PostMessage [DllImport("user32", CharSet = CharSet.Auto, SetLastError = true)] private static extern bool PostMessage(IntPtr hWnd, uint iMsg, IntPtr wParam, IntPtr lParam); #endregion public CAppCtrlObj() { } /// <summary> /// ermittelt Fensterhandle /// </summary> /// <param name="sWindowTitle">Fenstertitel</param> /// <param name="sWindowClassName">Name der zugehörigen Fensterklasse, kann null sein</param> /// <returns>Handle</returns> public IntPtr GetWindowHandle(string sWindowTitle, string sWindowClassName) { return FindWindow(sWindowClassName, sWindowTitle); } /// <summary> /// Nachricht an ein Fenster senden, wartet auf Ausführung /// </summary> /// <param name="hWnd">Fensterhandle</param> /// <param name="iMsg">Nachrichten-ID</param> /// <param name="wParam">1. Parameter, wenn nicht benötigt, dann IntPtr.Zero setzen</param> /// <param name="lParam">2. Parameter, wenn nicht benötigt, dann IntPtr.Zero setzen</param> /// <returns>Status</returns> public IntPtr SendMessageToWindow(IntPtr hWnd, uint uiMsg, IntPtr wParam, IntPtr lParam) { return SendMessage(hWnd, uiMsg, wParam, lParam); } /// <summary> /// Nachricht dem MessageQueue des Erzeugerthreads eines Fensters hinzufügen, wartet nicht auf Ausführung /// </summary> /// <param name="hWnd">Fensterhandle</param> /// <param name="iMsg">Nachrichten-ID</param> /// <param name="wParam">1. Parameter, wenn nicht benötigt, dann IntPtr.Zero setzen</param> /// <param name="lParam">2. Parameter, wenn nicht benötigt, dann IntPtr.Zero setzen</param> /// <returns>true, false</returns> public bool PostMessageToWindow(IntPtr hWnd, uint iMsg, IntPtr wParam, IntPtr lParam) { return PostMessage(hWnd, iMsg, wParam, lParam); } }