Domanda

Esiste un modo per rinominare la barra del titolo della finestra di un'applicazione che ho avviato? Cioè se avessi lanciato Notepad.exe, avrei potuto rinominare la barra del titolo da " Untitled - Notepad " a " Nuovo nome del blocco note " ;.

È stato utile?

Soluzione

Puoi farlo usando 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");
}

Lo sfondo del brutto hack nell'esempio di codice è che sembra che tu chiami SetWindowText immediatamente dopo aver avviato il processo, il titolo non cambierà. Forse il messaggio finisce troppo presto nella coda dei messaggi di Blocco note, quindi il blocco note imposterà nuovamente il titolo in seguito.

Nota anche che questa è una modifica molto breve; se l'utente seleziona File - > Nuovo (o fa qualsiasi altra cosa che farà sì che Blocco note aggiorni il titolo della finestra), il titolo originale tornerà ...

Altri suggerimenti

In realtà, l'ho ordinato da solo e funziona perfettamente. Grazie comunque.

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

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

Non puoi farlo in C #, ma puoi farlo usando un'API di basso livello. Inietti un thread nel processo, chiama SetWindowText () da esso

Come pensa @Fredrik M & # 246; rk, il problema è che è necessario attendere che la finestra possa ricevere messaggi per impostarne il titolo. Attendere 100 millisecondi può interrompere il looper di messaggi interno del programma ed è solo una soluzione alternativa. Per ricevere un messaggio, la finestra deve avere un handle utilizzato per fare riferimento a quella finestra, quindi puoi semplicemente attendere l'handle della finestra, che all'avvio dovrebbe essere IntPtr.Zero (un handle vuoto).

Ecco un esempio di questo approccio:

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

Usando Application.DoEvents() il programma continuerà a ricevere ed elaborare i messaggi di sistema, quindi non si bloccherà (né andrà in crash), sebbene non sia asincrono.

Puoi anche pensare di evitare il sovraccarico della CPU sostituendo l'istruzione while con una SpinWait.SpinUntil chiamata (quindi, dovrai importare System.Threading):

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

No.

Ciò richiederebbe che l'applicazione di destinazione consenta di modificare il titolo della finestra. Molti programmi usano i loro titoli per mostrare informazioni utili (come il nome del file aperto per la modifica in Blocco note o il <TITLE> del documento HTML aperto in Firefox).

L'unico caso di cui sono a conoscenza che consente a un utente di impostare il testo del titolo con poche restrizioni è CMD.EXE in esecuzione in una finestra della console. CMD supporta il comando TITLE incorporato che imposta il titolo della finestra in base ai suoi argomenti. Ma ciò non può essere fatto da una seconda finestra senza iniettare i tasti premuti nella finestra della console, cosa generalmente sconsigliata.

Modifica

Poiché l'idea è mobile che SetWindowText() farà questo per te, vorrei chiarire.

Quella funzione API cambia davvero la barra del titolo di una finestra di livello superiore. In effetti, è la chiamata che un'applicazione come Blocco note probabilmente sta usando per impostare il proprio titolo ogni volta che pensa che il titolo sia cambiato.

Il motivo per cui sostengo che questa non sia una soluzione è che il Blocco note cambia davvero il titolo quando lo desidera. Un'applicazione che supportava modifiche arbitrarie al suo titolo avrebbe un meccanismo di qualche tipo per ricordare che il titolo è stato modificato e non ripristina arbitrariamente la sua stringa di titolo preferita.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top