c#を使用して現在アクティブなウィンドウのタイトルを取得するにはどうすればよいですか?


109

C#を使用して、現在アクティブなウィンドウ(つまり、フォーカスがあるウィンドウ)のウィンドウタイトルを取得する方法を知りたいです。


2
アプリケーション内のどのウィンドウにフォーカスがあるか、どのアプリケーションのどのウィンドウにフォーカスがあるかを判断しようとしていましたか?
Peder Rice 14

これは関連するstackoverflow.com/questions/2423234/…なので、ボタンをクリックしてそれを実行したい場合は、フォームがフォーカスされていないことを確認する価値があります。
barlop 2017

回答:


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.aspxおよびblogs.msdn.com/oldnewthing/archive/2008/10/06/8969399.aspxに関連情報があります。
グレッグD

3
それを実行するためのnewbのメモ、using System.Runtime.InteropServices; およびdllインポートと静的extern行を配置する場所を再設定します。クラス内に貼り付ける
barlop 2015

1
@smink特定のユーザーのアクティブなフォアグラウンドウィンドウを取得する方法(プロセスがサービスとして実行されているとしましょう)。
tchelidze

リンクしたサイトは利用できません。:ここでのWebアーカイブ(おそらく)であるweb.archive.org/web/2015081404381​​0/http://www.csharphelp.com/...
Piotrek

2
また、フォアグラウンドウィンドウが変更されるたびにアプリに通知を送信したいです。そのためのイベントはありますか?
ピオトレック2017

18

WPFについて話している場合は、次を使用します。

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

アプリケーション全体がアクティブでない場合(他のプログラムにフォーカスがある場合)、IsActiveがtrueに設定されているウィンドウはありません。
トッド

実際、それは間違っている可能性があります。私の場合、非UIスレッドでWindow配列にアクセスしようとしていました。しかし、またケースでこれを見、私は右、まだ午前:social.msdn.microsoft.com/Forums/vstudio/en-US/...
トッド

4

ループしてApplication.Current.Windows[]、を使用して検索しIsActive == trueます。


11
これは、現在の.Netアプリケーションのウィンドウでのみ機能しませんか?d4ntは、どのアプリケーションに属していても、デスクトップで現在アクティブなウィンドウのタイトルを取得したいと考えています。
Quagmire 2010


2

GetForegroundWindow関数に基づく| Microsoft Docs

[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- Multi Document Interface)。

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.