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