Pregunta

¿Hay alguna forma de cambiar el nombre de la barra de título de la ventana de una aplicación que he lanzado? Es decir. si lancé Notepad.exe, podría cambiar el nombre de su barra de título de " Sin título - Notepad " a " Nuevo nombre del bloc de notas " ;.

¿Fue útil?

Solución

Puede hacerlo 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");
}

El trasfondo del truco feo en el ejemplo de código es que parece que llamas a SetWindowText inmediatamente después de comenzar el proceso, el título no cambiará. Quizás el mensaje termine demasiado temprano en la cola de mensajes del Bloc de notas, de modo que el bloc de notas establecerá el título nuevamente más tarde.

También tenga en cuenta que este es un cambio muy breve; si el usuario selecciona Archivo - > Nuevo (o cualquier otra cosa que haga que Notepad actualice el título de la ventana), el título original volverá ...

Otros consejos

En realidad, lo clasifiqué y funciona perfectamente. Gracias de todos modos.

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

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

No puedes hacerlo en C #, pero puedes hacerlo usando API de bajo nivel. Inyecte un hilo en el proceso, llame a SetWindowText () de ella

Como @Fredrik M & # 246; rk piensa, el problema es que hay que esperar a que la ventana pueda recibir mensajes para establecer su título. Esperar 100 milisegundos puede romper el bucle de mensajes interno del programa y es solo una solución alternativa. Para recibir un mensaje, la ventana debe tener un identificador que se utilice para hacer referencia a esa ventana, por lo que simplemente puede esperar el identificador de la ventana, que al inicio debe ser IntPtr.Zero (un identificador vacío).

Aquí hay un ejemplo de este enfoque:

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

Usando Application.DoEvents() el programa continuará recibiendo y procesando mensajes del sistema, por lo que no se bloqueará (ni bloqueará), aunque no sea asíncrono.

También puede pensar en evitar la sobrecarga de la CPU reemplazando la instrucción while con una llamada SpinWait.SpinUntil (por lo tanto, deberá importar System.Threading):

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

No.

Esto requeriría que la aplicación de destino permita modificar el título de la ventana. Muchos programas usan sus títulos para mostrar información útil (como el nombre del archivo abierto para editar en el Bloc de notas o el <TITLE> del documento HTML abierto en Firefox).

El único caso que conozco que permite a un usuario establecer el texto del título con pocas restricciones es CMD.EXE ejecutándose en una ventana de consola. CMD admite el comando incorporado TITLE que establece el título de la ventana en función de sus argumentos. Pero eso no se puede hacer con una segunda ventana sin inyectar teclas en la ventana particular de la consola, lo que generalmente no se recomienda.

Edición :

Dado que la idea es flotante de que SetWindowText() hará esto por usted, permítame aclararlo.

Esa función API de hecho cambia la barra de título de una ventana de nivel superior. De hecho, es la llamada que una aplicación como el Bloc de notas probablemente esté usando para establecer su propio título cada vez que piense que el título ha cambiado.

La razón por la que afirmo que esto es no una solución es que Notepad realmente cambia el título cuando lo desea. Una aplicación que admitiera cambios arbitrarios en su título tendría algún tipo de mecanismo para recordar que el título fue cambiado y no restaurar arbitrariamente su cadena de título preferida.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top