【问题标题】:Questions about Window Handles关于窗把手的问题
【发布时间】:2010-03-12 12:11:52
【问题描述】:

语言:c#.net 2.0

我有一个应用程序 X,它调用 SubWindows 1、2 和 3。

我会在打开 1、2 或 3 时弹出一个 MessageBox。

我的想法是一个计时器,每 3 秒计时一次,并检查窗户是否打开。

但是如何找到 3 个确切的窗口?我可以使用 Window-Handle-Spy-Application 并在我的代码中硬编码 Window-Handles 来找到它们吗?还是在新打开Application X时更改窗口句柄?

【问题讨论】:

    标签: c#-2.0


    【解决方案1】:

    我会根据Win32来回答,因为我对Win32比对.Net Framework更熟悉,你可以在.Net Framework中找到合适的函数或者使用P/Invoke来调用这些Win32函数。

    我假设您知道以下内容:

    • 应用程序 X 的进程 ID。
    • 名称(或文本)或 Windows 1、2、3 以及这些窗口具有唯一可识别的文本。

    如果您不知道进程 ID,则需要枚举进程并将每个进程的名称与应用程序 X 进行比较,当您获得匹配项时,您就知道进程 ID。

    要找到这三个窗口,我们需要做的第一件事是找到具有进程 ID 的顶级窗口。其中之一将是子窗口的祖先。

    使用 EnumWindows() 枚举所有窗口;在枚举过程中,记下所有具有您要查找的进程 ID 的窗口(可能不止一个)。

    使用与进程 ID 匹配的窗口列表,您需要检查该列表中每个窗口的所有后代。您可以使用 EnumChildWindows();确保您执行子窗口等的所有子窗口,直到没有更多子窗口。这样,您将覆盖该过程中的每个窗口。对于您找到的每个窗口,将其与您正在查找的子窗口的已知文本进行比较。当您在某处获得 HWND 的火柴商店时,您可以使用它。

    现在您有了 HWND,我假设您可以将它们变成 .Net 可用的 Windows 控件。

    我快速搜索了一下,似乎 EnumWindows 不是 .Net Framework 的一部分,因此您必须使用 P/Invoke 来完成这项工作。您可能更容易在 C/C++ 中编写一个辅助函数,该函数执行所有搜索并将 HWND 传回一个数组中 - 这样您只需通过 P/Invoke 调用一个函数以及为此所做的所有工作可以在C/C++中进行搜索,直接调用Win32会更直接。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-07-08
      • 2011-02-01
      • 2011-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-30
      相关资源
      最近更新 更多