起動したアプリケーションのウィンドウ タイトルバーの名前を変更する方法はありますか? つまり、Notepad.exe を起動した場合、そのタイトル バーの名前を「無題 - メモ帳」から「新しいメモ帳名」に変更できます。
7 に答える
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 を呼び出すと、タイトルが変更されないように見えることです。おそらく、メッセージがメモ帳のメッセージ キューで早く終わりすぎて、後でメモ帳がタイトルを再設定する可能性があります。
また、これは非常に短い変更であることに注意してください。ユーザーが [ファイル] -> [新規] を選択した場合 (または、メモ帳がウィンドウ タイトルを更新する原因となるその他の操作を行った場合)、元のタイトルに戻ります...
実際、私はそれを自分でソートしましたが、完全に機能します。とにかくありがとう。
[DllImport("user32.dll")]
static extern SetWindowText(IntPtr hWnd, string windowName);
IntPtr handle = p.MainWindowHandle;
SetWindowText(handle, "This is my new title");
C# ではできませんが、低レベル API を使用して実行できます。プロセスにスレッドを挿入し、そこからSetWindowText()を呼び出します
いいえ。
これには、ターゲット アプリケーションがウィンドウ タイトルを変更できるようにする必要があります。多くのプログラムは、タイトルを使用して有用な情報 (メモ帳で編集用に開いているファイルの名前や、<TITLE>
Firefox で開いている HTML ドキュメントの名前など) を表示します。
私が認識している 1 つのケースは、ユーザーがほとんど制限なくタイトル テキストを設定できるようにするもので、コンソール ウィンドウで実行されている CMD.EXE です。CMD は、TITLE
引数に基づいてウィンドウのタイトルを設定する組み込みコマンドをサポートしています。ただし、特定のコンソール ウィンドウにキー ストロークを挿入しないと、2 番目のウィンドウでこれを行うことはできません。これは一般的にはお勧めできません。
編集:
あなたのためにこれを行うアイデアが浮かんでいるので、SetWindowText()
明確にさせてください。
その API 関数は、実際にトップ レベル ウィンドウのタイトル バーを変更します。実際、これはメモ帳のようなアプリケーションが、タイトルが変更されたと判断したときに独自のタイトルを設定するために使用する可能性が高い呼び出しです。
これが解決策ではないと私が主張する理由は、メモ帳が必要に応じて実際にタイトルを変更するためです。タイトルの任意の変更をサポートするアプリケーションには、タイトルが変更されたことを記憶し、優先タイトル文字列を任意に復元しない何らかのメカニズムがあります。