2009-06-19 29 views
4

有沒有什麼辦法可以重新命名已啓動的應用程序的窗口標題欄?即如果我啓動了Notepad.exe,我可以將其標題欄從「無標題 - 記事本」重命名爲「新記事本名稱」。C# - 我如何重命名我開始的進程窗口?

+0

你的意思,而它的運行? – Sev 2009-06-19 07:58:32

+0

是的......儘管如果我在啓動過程之前可以指定標題欄,那也是可以接受的。 – GenericTypeTea 2009-06-19 07:59:16

+0

一般來說,除非應用程序支持該功能。許多人不知道。記事本包括當前在其標題欄中打開的文件的名稱,並且不支持標題的任何其他更改。另一方面,CMD.EXE具有內置的命令TITLE,可以控制控制檯窗口的標題。 – RBerteig 2009-06-19 08:02:03

回答

13

可以以P做/調用:

[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,標題不會改變。也許消息在記事本的消息隊列中過早結束,以便記事本以後再次設置標題。

另請注意,這是一個非常短暫的變化;如果用戶選擇文件 - >新建(或做任何其他事情,將導致記事本更新窗口標題),原標題將回來...

-3

編號

這將要求目標應用程序允許窗口標題根本被修改。許多程序使用它們的標題來顯示有用的信息(例如在記事本中打開的文件的名稱,或者在Firefox中打開的HTML文檔的<TITLE>)。

我知道的一種情況是,讓用戶設置標題文本的幾個限制是在控制檯窗口中運行CMD.EXE。 CMD支持TITLE內置命令,該命令根據參數設置窗口標題。但是如果不在特定的控制檯窗口中注入按鍵,通常不推薦使用第二個窗口。

編輯:

由於想法是浮動的那SetWindowText()會爲你做到這一點,讓我澄清。

該API函數確實會更改頂級窗口的標題欄。事實上,像記事本這樣的應用程序可能會在它認爲標題已經改變的時候設置自己的標題。

我聲稱這是而不是的一個解決方案的原因是記事本確實在它想要的時候改變標題。支持對其標題進行任意更改的應用程序會有某種機制記住標題已更改,而不是任意恢復其首選標題字符串。

+0

SetWindowText是解決這個問題的方法。它完全符合我的要求,因此不能否認它是解決問題的辦法。無論如何,我其實並沒有要求它是永久的,但正如我在其他評論中發佈的那樣,有一個簡單的解決方法可以保持它永久不變。 – GenericTypeTea 2009-06-19 10:33:55

4

其實,我自己排序它,它完美的作品。不管怎麼說,還是要謝謝你。

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

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

你不能在C#中做到這一點,但你可以做它使用低級別的API。 注入進程中的線程,請致電SetWindowText()

2

正如@FredrikMörk認爲的,問題是需要等待窗口可以接收消息來設置其標題。等待100毫秒會破壞程序的內部消息循環,這只是一個解決方法。 要接收消息,窗口必須有一個用於引用該窗口的句柄,因此您可以簡單地等待窗口的句柄,該句柄在啓動時應該是IntPtr.Zero(空句柄)。

下面是一個這種方法的例子:使用Application.DoEvents()程序將繼續接收和處理系統消息

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

,所以不會擋住(也不崩潰),儘管它不是異步的。

你也可以認爲通過用SpinWait.SpinUntil調用替換while聲明以避免內存泄漏(這樣,你需要導入System.Threading):

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