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