Hilfsklasse zum Versenden von Windows Messages

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);
    }
}