Pergunta

Existe alguma maneira eu posso mudar o nome da barra de título da janela de um aplicativo que eu já lançado? Ou seja, se eu lançou Notepad.exe, eu poderia mudar o nome de sua barra de título a partir. "Untitled - Notepad" para "Nome New Notepad"

Foi útil?

Solução

Você pode fazer isso 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");
}

O fundo do corte feio no exemplo de código é que parece como se você chamar SetWindowText imediatamente após o início do processo, o título não vai mudar. Talvez a mensagem acaba muito cedo na fila de mensagens do Bloco de notas, de modo que o bloco de notas irá definir o título novamente mais tarde.

Além disso, note que este é um muito breve mudança; Se o arquivo que o usuário seleciona -> New (ou faz qualquer outra coisa que fará com que o bloco de notas para atualizar o título da janela), o título original estará de volta ...

Outras dicas

Na verdade, eu ordenados-me e ele funciona perfeitamente. Obrigado na mesma.

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

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

Você não pode fazê-lo em C #, mas você pode fazê-lo usando baixo API nível. Injetar um fio no processo, chamar SetWindowText () partir dele

Como @Fredrik Mörk pensa, o problema é que não há necessidade de esperar para a janela pode receber mensagens para definir seu título. Espera 100 milissegundos pode quebrar o looper mensagem interna do programa e é apenas uma solução alternativa. Para receber uma mensagem, a janela deve ter um identificador que é usado para fazer referência a essa janela, assim você pode simplesmente aguardar o identificador da janela, que no arranque deve ser IntPtr.Zero (uma alça vazia).

Aqui está um exemplo desta abordagem:

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

Usando Application.DoEvents() o programa continuará a receber e sistema de processo de mensagens, por isso não irá bloquear (ou acidente), embora não seja assíncrona.

Você também pode pensar em sobrecarga evitar CPU, substituindo a declaração while com uma chamada SpinWait.SpinUntil (sim, você vai precisar para System.Threading importação):

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

Não.

Isso exigiria que o aplicativo de destino permitir que o título da janela de ser modificado em tudo. Muitos programas usam seus títulos para mostrar informações úteis (como o nome do arquivo aberto para edição no Bloco de notas, ou o <TITLE> do documento HTML aberto no Firefox).

O único caso que eu estou ciente de que permite ao usuário definir o texto do título com poucas restrições é CMD.EXE executado em uma janela do console. CMD suporta a TITLE built-in comando que define o título da janela com base em seus argumentos. Mas isso não pode ser feito por uma segunda janela sem injetar cursos chaves na janela de console particular, que geralmente não é recomendado.

Editar:

Uma vez que a idéia é flutuante que SetWindowText() vai fazer isso para você, deixe-me esclarecer.

Essa função API, de fato, mudar a barra de título de uma janela de nível superior. É, de fato, a chamada que um aplicativo como o Notepad é provavelmente a utilizar para definir seu próprio título a qualquer momento ele acha que o título foi alterado.

A razão de eu dizer que este é não a solução é que o bloco de notas, de fato, mudar o título quando quer. Um aplicativo que apoiou mudanças arbitrárias ao seu título teria um mecanismo de algum tipo de lembrar que o título foi mudado e não restaurar arbitrariamente sua seqüência título preferido.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top