Feedback

C# - Notepad öffnen und Text darin anzeigen

Veröffentlicht von am 3/19/2014
(0 Bewertungen)
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 Suchen > Fenster suchen 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 "Edit".

Wer möchte, findet das Fenster in der TreeView nachdem man auf OK geklickt hat. Über das Kontextmenü kann man weitere Eigenschaften und auch Meldungen abrufen.
Dadurch kann man sehr einfach Fenster sehr spezifisch finden oder Verhaltensweisen nachbauen. Wer sich für Spy++ 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.

Benötigte Namespaces
System
System.Diagnostics
System.Runtime.InteropServices
System.Threading

Benötigte Snippets
Zeilenumbrüche mit dem OS spezifischen Zeichen ersetzen
http://dotnet-snippets.de/snippet/zeilenumbrueche-mit-dem-os-spezifischen-zeichen-ersetzen/3855
/// <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("\r\n", "\n").Replace("\r", "\n").Replace("\n", Environment.NewLine);
}
[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
    }
}

Kommentare zum Snippet

 

Logge dich ein, um hier zu kommentieren!