Hilfsklasse zum Versenden von Strings über Windows-Message WM_COPYDATA

Mit folgender Klasse ist es möglich, spezif. Strings an ein Fenster zu senden. Die Auswertung dieser Messages innerhalb eigener Anwendungen ist in folgendem Artikel beschrieben: Link

  • Aufruf-Beispiel:
CAppCtrlObj wc = new CAppCtrlObj();
// Fenster-Handle eines geöffneten Fensters holen
IntPtr hWnd = wc.GetWindowHandle("MeinFensterName1", null);
if ((int)hWnd != 0)
{
    // an das gefundene Fenster eine Nachricht schicken, auf Ausführung warten
    IntPtr err = wc.SendStringMessageToWindow(hWnd, IntPtr.Zero, "Hallo.");
    if ((int)err != 0)
    {
        // Fehler beim Übermitteln
    }
}
  • Klasse:
using System.Runtime.InteropServices;

/// <summary>
/// Struct für die Stringübergabe an andere Fenster
/// </summary>
public struct SCopyData
{
    public IntPtr dwData;
    public int cbData;
    [MarshalAs(UnmanagedType.LPStr)]
    public string lpData;
}

public class CAppCtrlObj
{
    #region Message-Konstanten aus der Windows.h

    public const int WM_COPYDATA = 0x4A;

    #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://boycook.wordpress.com/2008/07/29/c-win32-messaging-with-sendmessage-and-wm_copydata/
    // http://craigcook.co.uk/samples/MessageHelper.cs.txt
    [DllImport("user32", CharSet = CharSet.Auto, SetLastError = true)]
    private static extern IntPtr SendMessage(IntPtr hWnd, uint uiMsg, IntPtr wParam, ref SCopyData 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>
    /// String mittels WM_COPYDATA an ein Fenster senden, wartet auf Ausführung
    /// </summary>
    /// <param name="hWnd">Fensterhandle</param>
    /// <param name="wParam">1. Parameter, wenn nicht benötigt, dann IntPtr.Zero setzen</param>
    /// <param name="sMessage">2. Parameter als Nachrichtenstring</param>
    /// <returns>Status</returns>
    public IntPtr SendStringMessageToWindow(IntPtr hWnd, IntPtr wParam, string sMessage)
    {
        byte[] sarr = Encoding.Default.GetBytes(sMessage);
    
        SCopyData cds;
        cds.dwData = IntPtr.Zero;
        cds.lpData = sMessage;
        cds.cbData = sarr.Length + 1;
    
        // SCopyData an Zielfenster übermitteln
        return SendMessage(hWnd, WM_COPYDATA, wParam, ref cds);
    }
}