4

我正在运行一个小工具(在 Windows 7、32 位上),我想查看在我尝试过的另一个应用程序中打开了什么文档,它适用于 Windows 上的记事本。

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

输出是:

       "New Text Document - Notepad"

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

这是我从具有 processName = "FooBar"的应用程序中得到 的实际运行窗口的顶部是:

“FooBar 软件版本 1.2 - [结果]”

我的代码给出:

“美食吧”

有任何想法吗?

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

所以我认为我的问题的解决方案可能在别处。这个可能没有答案。

4

3 回答 3

2

主窗口标题是您进入任务管理器并查看描述列时看到的,而不是窗口标题本身。

它是进程的标题,而不是进程中特定窗口的标题。一个给定的进程可以同时打开任意数量的窗口。

如果您需要实际的窗口标题,则必须像这样挂钩 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 );
}

}

于 2012-11-01T22:19:45.923 回答
0

您看到的“标题”可能是某种所有者绘制的 UI 元素,它覆盖了标题的视觉表示,而 Windows API 可能会忽略这种东西。

我建议使用 Spy++ 之类的工具检查窗口,看看是否是这种情况。

应用程序的作者也有可能决定覆盖该WM_GETTEXT消息并返回该消息而不是标题栏中的实际内容,尽管我不能 100% 确定是否GetWindowText()在此处调用以及它是否显式发送消息或有效其他方式。

于 2012-11-01T22:22:39.860 回答
0

开发者声明如下:

“我认为失败可能是由于 VB 6.0 中的已停用属性 Form.Caption 被 .NET 中的 Form.Text 替换”

感谢大家一路上提出的宝贵建议!

于 2012-11-21T19:51:23.380 回答