有沒有什麼辦法可以重新命名已啓動的應用程序的窗口標題欄?即如果我啓動了Notepad.exe,我可以將其標題欄從「無標題 - 記事本」重命名爲「新記事本名稱」。C# - 我如何重命名我開始的進程窗口?
回答
可以以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,標題不會改變。也許消息在記事本的消息隊列中過早結束,以便記事本以後再次設置標題。
另請注意,這是一個非常短暫的變化;如果用戶選擇文件 - >新建(或做任何其他事情,將導致記事本更新窗口標題),原標題將回來...
編號
這將要求目標應用程序允許窗口標題根本被修改。許多程序使用它們的標題來顯示有用的信息(例如在記事本中打開的文件的名稱,或者在Firefox中打開的HTML文檔的<TITLE>
)。
我知道的一種情況是,讓用戶設置標題文本的幾個限制是在控制檯窗口中運行CMD.EXE。 CMD支持TITLE
內置命令,該命令根據參數設置窗口標題。但是如果不在特定的控制檯窗口中注入按鍵,通常不推薦使用第二個窗口。
編輯:
由於想法是浮動的那SetWindowText()
會爲你做到這一點,讓我澄清。
該API函數確實會更改頂級窗口的標題欄。事實上,像記事本這樣的應用程序可能會在它認爲標題已經改變的時候設置自己的標題。
我聲稱這是而不是的一個解決方案的原因是記事本確實在它想要的時候改變標題。支持對其標題進行任意更改的應用程序會有某種機制記住標題已更改,而不是任意恢復其首選標題字符串。
SetWindowText是解決這個問題的方法。它完全符合我的要求,因此不能否認它是解決問題的辦法。無論如何,我其實並沒有要求它是永久的,但正如我在其他評論中發佈的那樣,有一個簡單的解決方法可以保持它永久不變。 – GenericTypeTea 2009-06-19 10:33:55
其實,我自己排序它,它完美的作品。不管怎麼說,還是要謝謝你。
[DllImport("user32.dll")]
static extern SetWindowText(IntPtr hWnd, string windowName);
IntPtr handle = p.MainWindowHandle;
SetWindowText(handle, "This is my new title");
你不能在C#中做到這一點,但你可以做它使用低級別的API。 注入進程中的線程,請致電SetWindowText()
正如@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");
- 1. 我如何關閉所有打開的窗口從我的C#程序?
- 2. 重命名窗口變量
- 3. 如何關閉已退出C的進程打開的窗口#
- 4. 如何從c#獲取一個進程窗口類的名字?
- 5. 如何重命名Linux上的進程?
- 6. c#如何將stdout重定向到新的進程窗口?
- 7. 如何獲取C#中的開放端口的進程名稱?
- 8. 我輸入名字後,命令窗口崩潰。 C
- 9. 如何保護我從vb.net程序開始的進程?
- 10. 如何枚舉屬於我的進程的頂級wxWidgets窗口?
- 11. 我如何列出從「USERABC」開始所有進程的IP?
- 12. 如何重命名java.exe/javaw.exe進程?
- 13. GWT:如何重命名我的模塊
- 14. 如何重命名我的CVS項目?
- 15. 如何重命名我的項目?
- 16. 如何根據開始文件名重命名文件?
- 17. 我如何開始網絡編程?
- 18. 如何重新開始我的代碼? C#控制檯
- 19. 我想獲得進程名,進程ID,進程路徑,產品名稱窗口標題
- 20. 我該如何調整我的tkinter程序的窗口大小?
- 21. Python - 我如何獲得Ubuntu上關注窗口的進程名稱(不是窗口標題)
- 22. SharpSSH進程和重命名
- 23. 如何開始Pygame窗口最大化?
- 24. 如何重新啓動我的窗口服務以編程方式在c#.net
- 25. 我如何控制C#中的線程窗口#
- 26. 使用python重命名窗口Xlib
- 27. 可可重命名MyDocument窗口標題
- 28. 我將如何重命名base64圖像
- 29. 我如何重寫rails命名約定?
- 30. 窗口中的進程打開的文件的名稱?
你的意思,而它的運行? – Sev 2009-06-19 07:58:32
是的......儘管如果我在啓動過程之前可以指定標題欄,那也是可以接受的。 – GenericTypeTea 2009-06-19 07:59:16
一般來說,除非應用程序支持該功能。許多人不知道。記事本包括當前在其標題欄中打開的文件的名稱,並且不支持標題的任何其他更改。另一方面,CMD.EXE具有內置的命令TITLE,可以控制控制檯窗口的標題。 – RBerteig 2009-06-19 08:02:03