我正在运行一个小工具(在
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 );
}
}