C #을 사용하여 현재 활성 창의 제목을 어떻게 얻습니까?


109

C #을 사용하여 현재 활성 창 (즉, 포커스가있는 창)의 창 제목을 잡는 방법을 알고 싶습니다.


2
응용 프로그램에서 포커스가있는 창 또는 포커스가있는 응용 프로그램 창을 확인하려고 했습니까?
Peder Rice

이것은 관련이 있습니다. stackoverflow.com/questions/2423234/… 버튼을 클릭하여 수행하려면 양식에 초점이 맞지 않는지 확인하는 것이 좋습니다.
barlop

답변:


165

여기에서 전체 소스 코드로이를 수행하는 방법에 대한 예를 참조하십시오.

http://www.csharphelp.com/2006/08/get-current-window-handle-and-caption-with-windows-api-in-c/

[DllImport("user32.dll")]
static extern IntPtr GetForegroundWindow();

[DllImport("user32.dll")]
static extern int GetWindowText(IntPtr hWnd, StringBuilder text, int count);

private string GetActiveWindowTitle()
{
    const int nChars = 256;
    StringBuilder Buff = new StringBuilder(nChars);
    IntPtr handle = GetForegroundWindow();

    if (GetWindowText(handle, Buff, nChars) > 0)
    {
        return Buff.ToString();
    }
    return null;
}

더 나은 정확성을 위해 @Doug McClean 주석으로 편집 되었습니다.


7
좋은 시민이되는 것을 잊지 마십시오. blogs.msdn.com/oldnewthing/archive/2007/07/27/4072156.aspxblogs.msdn.com/oldnewthing/archive/2008/10/06/8969399.aspx 에는 관련 정보가 있습니다.
Greg D

3
newb 노트, 그것을 실행 using System.Runtime.InteropServices; 하고 dll 가져 오기 및 정적 extern 행을 넣을 위치를 지정하십시오. 클래스 내에서 붙여 넣기
barlop

1
@smink 특정 사용자에 대한 활성 전경 창을 얻는 방법 (프로세스가 서비스로 실행된다고 가정 해 보겠습니다).
tchelidze

연결 한 사이트를 사용할 수 없습니다. 여기의 (아마도) 웹 아카이브는 다음과 같습니다 web.archive.org/web/20150814043810/http://www.csharphelp.com/...은
Piotrek

2
또한 전경 창이 변경 될 때마다 내 앱에 알림이 표시되기를 원합니다. 그에 대한 이벤트가 있습니까?
Piotrek

18

WPF에 대해 이야기하고 있다면 다음을 사용하십시오.

 Application.Current.Windows.OfType<Window>().SingleOrDefault(w => w.IsActive);

전체 응용 프로그램이 활성화되지 않은 경우 (다른 프로그램에 포커스가 있음) IsActive가 true로 설정된 창은 없습니다.
Todd

실제로 그것은 틀릴 수 있습니다. 제 경우에는 UI가 아닌 스레드에서 Window 배열에 액세스하려고했습니다. 그러나 내가 여전히 옳은 경우에도 다음을 참조하십시오. social.msdn.microsoft.com/Forums/vstudio/en-US/…
Todd

4

반복 Application.Current.Windows[]해서 IsActive == true.


11
이것은 현재 .Net 응용 프로그램의 창에서만 작동하지 않습니까? 나는 d4nt가 어떤 응용 프로그램에 속해 있든 관계없이 데스크톱에서 현재 활성 창의 제목을 얻고 싶어한다고 생각합니다.
Quagmire


2

GetForegroundWindow 함수 기반 | Microsoft 문서 :

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
static extern IntPtr GetForegroundWindow();

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
static extern int GetWindowText(IntPtr hWnd, StringBuilder text, int count);

[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
static extern int GetWindowTextLength(IntPtr hWnd);

private string GetCaptionOfActiveWindow()
{
    var strTitle = string.Empty;
    var handle = GetForegroundWindow();
    // Obtain the length of the text   
    var intLength = GetWindowTextLength(handle) + 1;
    var stringBuilder = new StringBuilder(intLength);
    if (GetWindowText(handle, stringBuilder, intLength) > 0)
    {
        strTitle = stringBuilder.ToString();
    }
    return strTitle;
}

UTF8 문자를 지원합니다.


0

MDI 응용 프로그램에서 현재 활성 양식 이 필요한 경우 : (MDI- 다중 문서 인터페이스).

Form activForm;
activForm = Form.ActiveForm.ActiveMdiChild;

-3

프로세스 클래스를 사용할 수 있습니다. 매우 쉽습니다. 이 네임 스페이스 사용

using System.Diagnostics;

활성 창을 얻기 위해 버튼을 만들고 싶다면.

private void button1_Click(object sender, EventArgs e)
    {            
       Process currentp = Process.GetCurrentProcess();
       TextBox1.Text = currentp.MainWindowTitle;  //this textbox will be filled with active window.
    }

2
이것은 잘못되었습니다. 현재 활성 창이 아닌 프로그램 제목이 표시됩니다.
isHuman 2015
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.