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