문제

시작한 응용 프로그램의 창 타이틀 바의 이름을 바꿀 수있는 방법이 있습니까? 즉, Notepad.exe를 시작한 경우 "Untitled -Notepad"에서 "New Notepad Name"으로 제목 표시 줄을 바꿀 수 있습니다.

도움이 되었습니까?

해결책

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를 호출하는 것처럼 보이면 제목이 변경되지 않는 것 같습니다. 아마도 메시지가 메모장의 메시지 대기열에서 너무 이르기 때문에 메모장이 나중에 다시 제목을 설정할 것입니다.

또한 이것은 매우 간단한 변화입니다. 사용자가 파일을 선택하는 경우 -> new (또는 메모장 제목을 업데이트 할 수있는 다른 것을 수행하는 경우) 원본 제목이 다시 나타납니다 ...

다른 팁

사실, 나는 직접 분류했고 완벽하게 작동합니다. 어쨌든 감사합니다.

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

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

C#에서는 할 수 없지만 낮은 레벨 API를 사용하여 수행 할 수 있습니다. 프로세스에 스레드를 주입하고 호출하십시오 setwindowText () 이것으로부터

@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() 이 프로그램은 시스템 메시지를 계속 수신하고 처리 할 것이므로 비동기식은 아니지만 차단하지도 않습니다.

또한 CPU 오버 헤드를 교체하여 피할 수 있다고 생각할 수도 있습니다. while a SpinWait.SpinUntil 전화 (따라서 가져와야합니다 System.Threading):

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

아니.

이를 위해서는 대상 응용 프로그램을 사용하면 창 제목을 전혀 수정해야합니다. 많은 프로그램이 타이틀을 사용하여 유용한 정보를 표시합니다 (예 : 메모장에서 편집하기 위해 열린 파일 이름 또는 <TITLE> Firefox에서 열린 HTML 문서).

내가 알고있는 한 가지 경우는 사용자가 콘솔 창에서 실행되는 CMD.exe가 제한이 거의없는 제목 텍스트를 설정할 수 있습니다. CMD는 TITLE 인수에 따라 창 제목을 설정하는 내장 명령. 그러나 키 스트로크를 특정 콘솔 창에 주입하지 않고 두 번째 창으로는 할 수 없습니다. 일반적으로 권장되지 않습니다.

편집하다:

아이디어가 떠 다니기 때문에 SetWindowText() 당신을 위해 이것을 할 것입니다. 명확하게하겠습니다.

API 기능은 실제로 최상위 창의 제목 표시 줄을 변경합니다. 사실, 메모장과 같은 응용 프로그램이 제목이 변경되었다고 생각할 때마다 자체 제목을 설정하는 데 사용하는 통화입니다.

내가 이것을 주장하는 이유 ~ 아니다 해결책은 메모장이 원할 때 제목을 실제로 변경한다는 것입니다. 제목에 대한 임의의 변경을 지원하는 응용 프로그램은 제목이 변경되었고 선호하는 타이틀 문자열을 임의로 복원하지 않았다는 것을 기억할 수있는 어떤 종류의 메커니즘을 가질 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top