c# – 为什么另一个应用程序窗口的标题中的文本不正确?

我正在运行一个小工具(在
Windows 7,32位上),我想看看在我尝试过的另一个应用程序中打开了哪个文档,这适用于Windows上的NotePad.

        var myProcess = Process.GetProcessesByName("NotePad");
        string title = myProcess[0].MainWindowTitle;
        MessageBox.Show(title); 

输出是:

       "New Text Document - Notepad"

现在,如果我尝试另一个应用程序它并不总是给我正确的标题,但我注意到大多数微软的应用程序似乎很好 – NotePad,写字板,EXCEL等.这是另一个问题的软件.它有一个很长的标题,但只返回一个非常简单的名称.

这是我从我的应用程序获得的processName =“FooBar”
实际运行的窗口有这个顶部:

“FooBar Software Verson 1.2 – [Results]”

我的代码给出:

“FooBar”

有任何想法吗?

[编辑] 2012-11-19
这个问题的关键在于我试图从窗口中获取打开文件的名称.现在看来我正在使用的软件没有在那里显示它.我发现一个叫做“AutoIT3 Window Spy”的程序可以得到我需要的文本,因为打开文件的文本在窗口上,而不仅仅是在标题中.我下载了源代码(它是http://www.autohotkey.com/的一部分,它是开源的.它似乎依赖于已经提出的许多建议,但我还不能解决它.)我看的源代码是c并且位于这里https://github.com/AutoHotkey/AutoHotkey

所以我认为我的问题的解决方案可能在其他地方.这个可能没有答案.

最佳答案 主窗口标题是您在进入任务管理器并查看“描述”列时看到的内容,而不是窗口标题本身.

它是流程的标题,而不是流程中特定窗口的标题.给定进程可以一次打开任意数量的窗口.

如果你需要实际的窗口标题,你必须挂钩user32这样的东西:

using System;
using System.Runtime.InteropServices;
using System.Text;
using System.Security;



namespace Application
{
public class Program
{
    public static void Main ( )
    {
        IntPtr hwnd = UnsafeNativeMethods.FindWindow("Notepad", null);
        StringBuilder stringBuilder = new StringBuilder(256);
        UnsafeNativeMethods.GetWindowText(hwnd, stringBuilder, stringBuilder.Capacity);
        Console.WriteLine(stringBuilder.ToString());
    }
}

[SuppressUnmanagedCodeSecurity]
internal static class UnsafeNativeMethods
{
    [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
    internal static extern int GetWindowText ( IntPtr hWnd, [Out] StringBuilder lpString, int nMaxCount );
    [DllImport("user32.dll", SetLastError = true)]
    internal static extern IntPtr FindWindow ( string lpClassName, string lpWindowName );
}

}

点赞