如何使用C#获取当前活动窗口的标题?


109

我想知道如何使用C#来获取当前活动窗口(即具有焦点的窗口)的窗口标题。


2
您是在尝试确定应用程序中的哪个窗口具有焦点或任何应用程序的哪个窗口具有焦点?
Peder Rice 2014年

这是与stackoverflow.com/questions/2423234/…相关的,因此,如果您希望单击按钮来执行此操作,则值得确保表单不被关注。
barlop

Answers:


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注释进行编辑,以获得更好的正确性。



3
一个newb注释,使其运行,using System.Runtime.InteropServices; 并重新放置dll导入和静态外部行。将其粘贴到班级中
-barlop

1
@smink如何获取特定用户的活动前台窗口(假设进程作为服务运行)。
tchelidze '16

您链接到的站点不可用。这里是(可能是)它的网络档案:web.archive.org/web/2015081404381​​0/http
//www.csharphelp.com/…– Piotrek

2
另外,我希望我的应用程序在前景窗口每次更改时得到通知。有什么事吗?
Piotrek

18

如果您正在谈论WPF,请使用:

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

如果整个应用程序都不处于活动状态(另一个程序具有焦点),则没有窗口会将IsActive设置为true。
托德

实际上,这可能是错误的,以我为例,我试图在非UI线程上访问Window数组。但是,也可以在我仍然正确的情况下看到此信息:social.msdn.microsoft.com/Forums/vstudio/en-US/…–
Todd

4

循环搜索Application.Current.Windows[]并找到一个IsActive == true


11
这仅不适用于当前.Net应用程序中的Windows吗?我认为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年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.