Frage

Gibt es eine Möglichkeit, die Fensterleiste einer Anwendung umbenennen, die ich ins Leben gerufen habe? D. h wenn ich Notepad.exe gestartet, konnte ich die Titelleiste von umbenennen. „Unbenannt - Editor“ auf „New Notepad Namen“

War es hilfreich?

Lösung

Sie können es mit P / Invoke:

[DllImport("user32.dll")]
static extern int SetWindowText(IntPtr hWnd, string text);



private void StartMyNotepad()
{
    Process p = Process.Start("notepad.exe");
    Thread.Sleep(100);  // <-- ugly hack
    SetWindowText(p.MainWindowHandle, "My Notepad");
}

Der Hintergrund des hässlichen Hack in dem Codebeispiel ist, dass es scheint, als ob Sie SetWindowText rufen Sie sofort nach dem Start des Prozesses, wird der Titel nicht ändern. Vielleicht ist die Nachricht zu früh in der Nachrichten-Warteschlange landet der Editor, so dass Notizblock den Titel danach wieder eingestellt werden.

Beachten Sie auch, dass dies eine sehr kurze Änderung ist; wenn der Benutzer Datei auswählt -> Neu (oder tut etwas anderes, das Notepad bewirkt, dass der Fenstertitel aktualisieren), wird der Titel wieder ...

Andere Tipps

Eigentlich sortierte ich es selbst und es funktioniert perfekt. Trotzdem danke.

[DllImport("user32.dll")]
static extern SetWindowText(IntPtr hWnd, string windowName);

IntPtr handle = p.MainWindowHandle;
SetWindowText(handle, "This is my new title");

Sie können es in C # nicht tun, aber man kann es mit Low Level-API tun. Einzuspritzen ein Gewinde in den Prozess rufen SetWindowText () von it

Wie @Fredrik Mörk denkt, ist das Problem, dass es für das Fenster warten muß, um Nachrichten empfangen kann seinen Titel zu setzen. 100 Millisekunden warten, kann die interne Meldung Looper des Programms brechen und es ist nur eine Abhilfe. Um eine Nachricht zu erhalten, muss das Fenster einen Griff hat, der für die Referenzierung auf dieses Fenster verwendet wird, so können Sie einfach für den Griff des Fensters warten, die bei der Inbetriebnahme wurden IntPtr.Zero sollten (ein leerer Griff).

Hier ist ein Beispiel für diesen Ansatz:

Process p = Process.Start("notepad.exe");
while (p.MainWindowHandle == IntPtr.Zero)
    Application.DoEvents();
SetWindowText(p.MainWindowHandle, "My Notepad");

Mit dem Programm Application.DoEvents() weiterhin Nachrichten empfangen und zu verarbeiten System, so dass es nicht blockiert wird (noch Absturz), obwohl es nicht asynchron ist.

Sie können auch CPU-Overhead zu vermeiden, denken durch die while Anweisung mit einem SpinWait.SpinUntil Aufruf zu ersetzen (so, werden Sie System.Threading importieren müssen):

Process p = Process.Start("notepad.exe");
SpinWait.SpinUntil(delegate
{
    return p.MainWindowHandle != IntPtr.Zero;
});
SetWindowText(p.MainWindowHandle, "My Notepad");

Nein.

Dies würde erfordern, dass die Zielanwendung der Fenstertitel erlaubt überhaupt geändert werden. Viele Programme nutzen, um ihren Titel nützliche Informationen (wie der Name der Datei zur Bearbeitung geöffnet in dem Editor oder den <TITLE> des HTML-Dokuments öffnet in Firefox) zu zeigen.

Der einzige Fall, dass ich davon bewusst bin, können Benutzer den Titeltext mit wenigen Einschränkungen festgelegt ist cmd.exe in einem Konsolenfenster ausgeführt wird. CMD unterstützt den TITLE integrierten Befehl, der den Fenstertitel an seinen Argumenten basieren setzt. Aber das kann nicht durch ein zweites Fenster vorgenommen werden, ohne Tastenanschläge in die jeweiligen Konsolenfenster eingespritzt wird, die in der Regel nicht empfohlen.

Edit:

Da die Idee schwebt dass SetWindowText() wird dies für Sie tun, lassen Sie mich klarstellen.

Die API-Funktion ändert sich in der Tat auf die Titelleiste eines Top-Level-Fenster. Es ist in der Tat, der Anruf, dass eine Anwendung wie Notepad wahrscheinlich jederzeit einstellen seinen eigenen Titel nutzt das denkt, dass der Titel geändert hat.

Der Grund, warum ich behaupten, dass dies nicht eine Lösung ist, dass Notepad in der Tat den Titel ändert sich, wenn er will. Eine Anwendung, die willkürliche Änderungen an seinen Titel unterstützt würde einen Mechanismus irgendeiner Art haben sich daran zu erinnern, dass der Titel geändert wurde und nicht willkürlich ihre bevorzugten Titel Zeichenfolge wiederherzustellen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top