0

次のように、ウィンドウ階層を指定して特定のウィンドウを見つける関数を作成しています。

protected bool MapWindowHierarchy (ATS.Library.Window window)
{
    bool result = false;
    List<Process> processes = null;

    processes = GetProcesses().ToList();

    processes.ForEach
    (
        process =>
        {
            if (process.MainWindowHandle == window.Handle)
            {
                // Populate window properties.
                //  Get child windows with filled properties.
            }
        }
    );

    return (result);
}

protected bool MapWindowHierarchy (List<ATS.Library.Window> windows)
{
    return (windows.All(window => this.MapWindowHierarchy(window)));
}

public sealed class Window
{
    public IntPtr Handle { get; set; }
    public string Class { get; set; }
    public Rectangle Bounds { get; set; }
    public Win32Api.User32.ShowWindowCommands WindowState { get; set; }
    public string Caption { get; set; }
    public int Style { get; set; }
    public List<ATS.Library.Window> Windows { get; set; }

    public void PopulateFromHandle(IntPtr hWnd)
    {
        // Populate above properties using Win32 API.
    }
}

これは大まかなコードですが、目的は、[Window]クラスを使用して階層を作成し、実際の階層を使用して[EnumChildWindows]一致するかどうかを確認することです。これは明らかにうまくいきますが、私はこの SO の質問, Hans Passant's commentに出くわしました"Every unique window in a desktop session must have a unique Windows class name".それを解釈する方法がわかりませんでした (同じクラス名の複数のウィンドウについては下の画像を参照してください)。おそらく、彼が言及していることはマネージ コード (WinForms、WPF など) にのみ適用されます。

さらに、Spy++ のようにハンドル (hWnd) を持っている場合、ウィンドウのクラス名とテキストを取得する方法がわかりません (下の画像を参照)。[Find Window]ダイアログではなく、ツリー ビューでテキストがどのように取得されるかに注目してください。

スパイ++

質問:

  • ネイティブ アプリのみをターゲットにしているので、Han のコメントについて心配する必要がありますか?
  • ウィンドウのハンドルを指定してクラス名を取得する方法は?
  • ウィンドウのハンドルを指定してウィンドウテキストを取得する方法(画像のように)?
4

1 に答える 1

2

なぜあなたが心配しなければならないのか分かりません。ただし、スクリーンショットで強調表示したこれらの「ボタン」コントロールは、固有のウィンドウではありません。それらはすべて同じように見え、クリックするとまったく同じように動作します。唯一の違いは、テキストの「プロパティ」が異なることです。したがって、それらはまったく同じウィンドウ「クラス」です。winapi は C API であり、C 言語はクラスまたはプロパティをサポートしていないため、「プロパティ」と「クラス」を二重引用符で囲みます。

ウィンドウ クラスは、ウィンドウの一連のプロパティを事前に選択します。それらは、RegisterClassEx() を呼び出す前に入力したWNDCLASSEX 構造体で確認できます。次に、そこからウィンドウを作成し、CreateWindowEx() winapi 呼び出しでクラス名を渡します。このスキームは、C# でクラスを使用して類似のオブジェクトを作成するのと同じように、類似のウィンドウを簡単に作成できるように設計されています。ただし、独自の Text プロパティを持つことはできます。そして、独自の Click イベント ハンドラー。

GetClassName() winapi 関数を使用してハンドルからウィンドウ クラス名を取得します。

GetWindowText() winapi 関数を使用して、ハンドルからテキスト「プロパティ」を取得します。GetWindowTextLength() は、GetWindowText() に渡す必要がある文字列バッファーの大きさを示します。

于 2013-06-10T11:22:24.690 に答える