4

私は小さなツール (Windows 7、32 ビット) を実行しています。これを試した別のアプリケーションでどのドキュメントが開いているかを確認したいのですが、これは Windows のメモ帳で動作します。

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

出力は次のとおりです。

       "New Text Document - Notepad"

ここで、別のアプリケーションを試してみると、常に正しいタイトルが表示されるとは限りませんが、ほとんどの Microsoft アプリケーション (メモ帳、ワードパッド、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実際にタイトルバーにあるものではなくそれを返している可能性もありますが、GetWindowText()ここで が呼び出されているかどうか、メッセージを明示的に送信するかどうか、または機能するかどうかは100% わかりません他の方法。

于 2012-11-01T22:22:39.860 に答える
0

開発者は次のように述べています。

「この失敗は、VB 6.0 で廃止されたプロパティ Form.Caption が .NET の Form.Text に置き換えられたことが原因である可能性があると思います」

途中で貴重な提案をありがとうございました!

于 2012-11-21T19:51:23.380 に答える