Question

Existe-t-il un moyen de renommer la barre de titre de la fenêtre d'une application que j'ai lancée? C'est à dire. si je lançais Notepad.exe, je pourrais renommer sa barre de titre en & "Untitled - Notepad &"; & "Nouveau nom du bloc-notes &";

Était-ce utile?

La solution

Vous pouvez le faire en utilisant 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");
}

L’arrière-plan de ce vilain piratage dans l’exemple de code montre qu’il semble que si vous appelez SetWindowText immédiatement après le démarrage du processus, le titre ne changera pas. Le message se termine peut-être trop tôt dans la file de messages du Bloc-notes, de sorte que celui-ci remettra le titre à nouveau par la suite.

Notez également qu'il s'agit d'un très bref changement. si l'utilisateur sélectionne Fichier - > Nouveau (ou fait autre chose qui entraînerait la mise à jour du titre de la fenêtre par Notepad), le titre original sera de retour ...

Autres conseils

En fait, je l'ai trié moi-même et cela fonctionne parfaitement. Merci quand même.

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

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

Vous ne pouvez pas le faire en C #, mais vous pouvez le faire en utilisant une API de bas niveau. Pour injecter un fil dans le processus, appelez SetWindowText () à partir de cela

Comme le pense @Fredrik M & # 246; rk, le problème est qu’il faut attendre que la fenêtre puisse recevoir des messages pour définir son titre. Attendre 100 millisecondes peut casser le boucleur de messages interne du programme et c'est juste une solution de contournement. Pour recevoir un message, la fenêtre doit avoir un handle utilisé pour référencer cette fenêtre. Vous pouvez donc simplement attendre le handle de la fenêtre, qui au démarrage doit être IntPtr.Zero (un handle vide).

Voici un exemple de cette approche:

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

En utilisant Application.DoEvents(), le programme continuera à recevoir et à traiter les messages système. Ainsi, il ne bloquera pas (ni ne plantera) bien qu'il ne soit pas asynchrone.

Vous pouvez également éviter le temps processeur en remplaçant l'instruction while par un appel SpinWait.SpinUntil (vous devrez donc importer System.Threading):

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

Non.

Ceci nécessiterait que l'application cible autorise la modification du titre de la fenêtre. De nombreux programmes utilisent leurs titres pour afficher des informations utiles (telles que le nom du fichier ouvert pour modification dans le Bloc-notes ou le <TITLE> du document HTML ouvert dans Firefox).

Le seul cas qui, à ma connaissance, permette à un utilisateur de définir le texte du titre avec peu de restrictions est CMD.EXE qui s'exécute dans une fenêtre de console. CMD prend en charge la commande intégrée TITLE qui définit le titre de la fenêtre en fonction de ses arguments. Mais cela ne peut pas être fait par une seconde fenêtre sans injecter des touches dans la fenêtre de la console, ce qui n’est généralement pas recommandé.

Modifier:

Puisque l'idée est flottante que SetWindowText() le fera pour vous, laissez-moi préciser.

Cette fonction API modifie en effet la barre de titre d'une fenêtre de niveau supérieur. C’est en fait l’appel qu’une application comme Notepad utilisera probablement pour définir son propre titre chaque fois qu’elle pense que celui-ci a changé.

Si je prétends que ce n'est pas une solution, c'est que Notepad modifie effectivement le titre lorsqu'il le souhaite. Une application qui prend en charge des modifications arbitraires de son titre disposerait d'un mécanisme permettant de se rappeler que le titre a été modifié et de ne pas restaurer arbitrairement sa chaîne de titre préférée.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top