【问题标题】:Getting child window's handle C\C++获取子窗口句柄\C++
【发布时间】:2011-03-24 18:16:16
【问题描述】:

我已经尝试在这里和谷歌上搜索,我最终得到了“GetDlgItem”方法,但它不起作用。

这是我的代码:

HWND hwnd_Parent;
HWND hwnd_Child;

hwnd_Parent = FindWindow(NULL,"MyTitle");
hwnd_Child = GetDlgItem(hwnd, 0x00030756);

hwnd_Parent 没问题(我什至做了一些帖子测试),但 hwnd_Child 为空。 所以,你看到的十六进制数是通过 WinSpy++ 找到的。

我的系统是 Windows 7 64 位,我的 IDE 是 Code Blocks。

提前致谢。

【问题讨论】:

  • 请不要将控件的 ID 与句柄混淆。您是在自己的代码中创建窗口还是在另一个进程中寻找它们?我问的原因是 CreateWindow 允许您设置子窗口的控件 ID。控件 ID 不太可能是动态的,您可以从 Spy++ 中获得它,这样您就可以对 ID 进行硬编码。无需使用通过 SPy++ 找到的子句柄

标签: c++ c winapi parent-child handle


【解决方案1】:

您需要知道窗口的 ID 才能使用GetDlgItem()。我怀疑你传入了一个从 Spy++ 获得的 HWND。

看起来您正在另一个应用程序中闲逛,因为如果它是您自己的应用程序,那么您不需要调用 FindWindow,并且您会知道控件 ID。

从 FindWindow 获得顶层窗口后,找到此窗口的最简单方法可能是调用 EnumChildWindows()

【讨论】:

  • 但是它返回了许多级别,并且没有一个真正匹配来自 WinSpy++ 的控件 ID。我实际上需要从父窗口深入 3 层。
  • @WoF_Angel 您需要找到唯一标识窗口的东西,然后在枚举回调测试中找到它。 EnumChildWindows() 遍历所有级别。
  • 它与来自 WinSpy++ 的 ID 一起使用,我会调查您的提示,谢谢。但是,您能帮我从该窗口中列表框的元素中获取文本吗(它是唯一的)?
  • 列表框记录在here。向其发送LB_GETCOUNT 消息以了解列表中有多少项目。然后向它发送大量LB_GETTEXT 消息以读出内容。
  • 如果 ID 发生变化,那么您可能无法依赖它。您可能会发现窗口类可以根据您的需要唯一地识别窗口。
【解决方案2】:

GetDlgItem 获取控件的 ID。 0x00030756 已经看起来像一个句柄,那么你到底想获得什么?

hwnd_Child = (HWND)0x00030756;

(当然,这只是一个例子。无论如何硬编码句柄值也无济于事。)

【讨论】:

  • 我注意到控件 id 改变了一次,我更新了它并且它工作了,但现在它不再工作了,我试图弄清楚发生了什么。甚至不知道他们可以这样改变,我不得不刷新 WinSpy++
  • @WoF_Angel:WinSpy 只是一个调试工具,不要用它来为你的程序生成输入。
  • 好的,这可能不是最好的选择,但它现在正在工作,谢谢。但是,嘿,我需要在我的子窗口中获取唯一列表框的内容,你能帮我解决这个问题吗?我正在尝试挖掘一些关于 LB_GETCOUNT 或 LB_GETTEXT 的信息。
  • @WoF_Angel:您可能需要以某种方式识别该窗口,可能通过它的标题或类。对句柄进行硬编码是行不通的,因为每次创建窗口时句柄值都会改变。
【解决方案3】:

先用HWND调用GetDlgCtrlID获取控件ID

int GetDlgCtrlID(HWND controlHandle);

然后使用CWnd函数GetDlgItem

CWnd* GetDlgItem(int controlID);

【讨论】:

    猜你喜欢
    • 2010-11-30
    • 2015-07-21
    • 1970-01-01
    • 1970-01-01
    • 2011-01-28
    • 1970-01-01
    • 2012-11-22
    • 1970-01-01
    相关资源
    最近更新 更多