Feedback

Notepad öffnen und Text darin anzeigen

Sprache: C#

Dieses Snippet öffnen das Windows-Programm Notepad (Texteditor) und zeigt einen Text darin an. Das Programm kann anschließend wieder geschlossen werden, ohne dass zum Speichern aufgefordert wird. Eigentlich ist an dem Snippet alles selbst erklärend. Lediglich interressant ist das Herausfinden des Fensternamens. Mit Visual Studio wird ein Programm namens "Spy++" installiert. Dieses liegt auch in einer 64 Bit Version vor. Ich kann leider nicht sagen, ob es mit den Express-Versionen mit installiert wird. Das Programm ist in der Lage verschiedene Eigenschaften von Fenstern heraus zu finden. Zunächst muss man auf [b]Suchen > Fenster suchen[/b] klicken. Das kleine Fadenkreuz kann man dann auf ein Fenster ziehen. Hier auf das Eingabefeld von Notepad. Nun erhält man den Klassennamen des Fensters. Hier ist das [b]"Edit"[/b]. Wer möchte, findet das Fenster in der TreeView nachdem man auf OK geklickt hat. Über das [b]Kontextmenü[/b] kann man weitere [b]Eigenschaften[/b] und auch [b]Meldungen[/b] abrufen. Dadurch kann man sehr einfach Fenster sehr spezifisch finden oder Verhaltensweisen nachbauen. Wer sich für [b]Spy++[/b] interessiert sollte in die Hilfe von VS schauen: http://msdn.microsoft.com/de-de/library/dd460725.aspx Mit SendMessage wird dann auf die WinAPI-Variante der anzuzeigende Text gesetzt. [b]Benötigte Namespaces[/b] System System.Diagnostics System.Runtime.InteropServices System.Threading [b]Benötigte Snippets[/b] Zeilenumbrüche mit dem OS spezifischen Zeichen ersetzen http://dotnet-snippets.de/snippet/zeilenumbrueche-mit-dem-os-spezifischen-zeichen-ersetzen/3855 [code]/// <summary> /// Ersetzt Zeilenumbrüche mit dem in dem Betriebssystem verwendeten Zeilenumbruchszeichen. /// </summary> /// <param name="s">Die Zeichenfolge deren Zeilenumbrüche ersetzt werden sollen.</param> /// <returns>Die Zeichenfolge <paramref name="s"/> wobei jeder Zeilenumbruch mit dem Wert von <see cref="System.Environment.NewLine"/> ersetzt wurde.</returns> public static string ReplaceEnvironmentsNewLine(this string s) { return s.Replace("rn", "n").Replace("r", "n").Replace("n", Environment.NewLine); }[/code]
[DllImport("user32.dll")]
static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);
[DllImport("user32.dll")]
static extern int SendMessage(IntPtr hWnd, int uMsg, int wParam, string lParam);
const int WM_SETTEXT = 0xc;

/// <summary>
/// Öffnet Notepad und zeigt einen Text an. Notepad kann anschließend wieder geschlossen werden ohne das eine Anforderung zum speichern erscheint.
/// </summary>
/// <param name="content">Der anzuzeigende Text.</param>
public static void OpenNotepad(string content)
{
    Process p = new Process();
    p.StartInfo = new ProcessStartInfo("notepad.exe");
    p.Start();//Prozess starten

    if (!string.IsNullOrEmpty(content))
    {
        while (p.MainWindowHandle == IntPtr.Zero)
            Thread.Sleep(100);//Warten bis das Fenster erzeugt wurde

        IntPtr child = FindWindowEx(p.MainWindowHandle, new IntPtr(0), "Edit", null);//Fenster finden
        SendMessage(child, WM_SETTEXT, 0, content.ReplaceEnvironmentsNewLine());//Text setzen
    }
}
[DllImport("user32.dll")]
static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);
[DllImport("user32.dll")]
static extern int SendMessage(IntPtr hWnd, int uMsg, int wParam, string lParam);
const int WM_SETTEXT = 0xc;

/// <summary>
/// Öffnet Notepad und zeigt einen Text an. Notepad kann anschließend wieder geschlossen werden ohne das eine Anforderung zum speichern erscheint.
/// </summary>
/// <param name="content">Der anzuzeigende Text.</param>
public static void OpenNotepad(string content)
{
    Process p = new Process();
    p.StartInfo = new ProcessStartInfo("notepad.exe");
    p.Start();//Prozess starten

    if (!string.IsNullOrEmpty(content))
    {
        while (p.MainWindowHandle == IntPtr.Zero)
            Thread.Sleep(100);//Warten bis das Fenster erzeugt wurde

        IntPtr child = FindWindowEx(p.MainWindowHandle, new IntPtr(0), "Edit", null);//Fenster finden
        SendMessage(child, WM_SETTEXT, 0, content.ReplaceEnvironmentsNewLine());//Text setzen
    }
}