C # - Как я могу переименовать окно процесса, который я запустил? - PullRequest
5 голосов
/ 19 июня 2009

Можно ли как-нибудь переименовать заголовок окна запущенного приложения? То есть если бы я запустил Notepad.exe, я мог бы переименовать строку заголовка с «Untitled - Notepad» на «New Notepad Name».

Ответы [ 5 ]

14 голосов
/ 19 июня 2009

Вы можете сделать это, используя 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");
}

Фон уродливого взлома в примере кода заключается в том, что если вы вызываете SetWindowText сразу после запуска процесса, заголовок не изменится. Возможно, сообщение слишком рано попадает в очередь сообщений Блокнота, поэтому после этого блокнот снова установит заголовок.

Также обратите внимание, что это очень краткое изменение; если пользователь выберет Файл -> Создать (или сделает что-нибудь еще, что приведет к тому, что Блокнот обновит заголовок окна), исходный заголовок вернется ...

4 голосов
/ 19 июня 2009

Вы не можете сделать это в C #, но вы можете сделать это с помощью низкоуровневого API. Внедрить поток в процесс, вызвать SetWindowText () из него

4 голосов
/ 19 июня 2009

На самом деле, я сам разобрался, и он отлично работает. В любом случае, спасибо.

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

IntPtr handle = p.MainWindowHandle;
SetWindowText(handle, "This is my new title");
3 голосов
/ 20 июля 2017

Как считает @Fredrik Mörk, проблема в том, что нужно ждать, пока окно сможет получать сообщения, чтобы установить его заголовок. Ожидание 100 миллисекунд может сломать внутреннюю петлю сообщений программы, и это всего лишь обходной путь. Чтобы получить сообщение, окно должно иметь дескриптор, который используется для обращения к этому окну, поэтому вы можете просто дождаться дескриптора окна, который при запуске должен быть IntPtr.Zero (пустой дескриптор).

Вот пример такого подхода:

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

Используя Application.DoEvents(), программа продолжит получать и обрабатывать системные сообщения, поэтому она не будет блокироваться (или аварийно завершать работу), хотя она не является асинхронной.

Вы также можете избежать загрузки ЦП, заменив оператор while на вызов SpinWait.SpinUntil (поэтому вам нужно будет импортировать System.Threading):

Process p = Process.Start("notepad.exe");
SpinWait.SpinUntil(delegate
{
    return p.MainWindowHandle != IntPtr.Zero;
});
SetWindowText(p.MainWindowHandle, "My Notepad");
0 голосов
/ 19 июня 2009

номер

Для этого потребуется, чтобы целевое приложение позволяло вообще изменять заголовок окна. Многие программы используют свои заголовки для отображения полезной информации (например, имя файла, открытого для редактирования в Блокноте, или <TITLE> документа HTML, открытого в Firefox).

Единственный известный мне случай, который позволяет пользователю задавать текст заголовка с небольшими ограничениями, - это запуск CMD.EXE в окне консоли. CMD поддерживает встроенную команду TITLE, которая устанавливает заголовок окна на основе его аргументов. Но это невозможно сделать вторым окном, не вводя нажатия клавиш в конкретное окно консоли, что обычно не рекомендуется.

Edit:

Так как идея плавает, что SetWindowText() сделает это для вас, позвольте мне уточнить.

Эта функция API действительно меняет строку заголовка окна верхнего уровня. Фактически, это вызов, который приложение, такое как Notepad, может использовать для установки собственного заголовка в любое время, когда оно думает, что заголовок изменился.

Причина, по которой я утверждаю, что это , а не , решение состоит в том, что Блокнот действительно меняет заголовок, когда захочет. Приложение, которое поддерживает произвольные изменения своего заголовка, будет иметь некоторый механизм для запоминания того, что заголовок был изменен, и не будет произвольно восстанавливать предпочитаемую строку заголовка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...