【问题标题】:How to get HWND in win32?如何在win32中获得HWND?
【发布时间】:2010-12-01 01:21:29
【问题描述】:

有没有办法获取我的窗口的 HWND 处理程序?
我用的是win32。

【问题讨论】:

  • 是的...但是我的班级需要它。我知道如何通过将它作为变量传递来做到这一点,但我想要类似函数的东西来为我获取它而不是传递它
  • HWND handler...你的意思是窗口过程吗?
  • 我从 CreateWindow() 得到的那个。
  • 嗯...CreateWindow() 返回 HWND。比,我把它存放在某个地方,而不是把它传给我的班级。我就是这样做的。我只是通过不创建窗口来询问 win32 是否具有通过我的窗口的 HWND 的功能
  • @Ramilol:我不知道为什么人们会因此而严厉批评你。鉴于英语显然不是您的主要语言,这是一个完全有效的问题,并且表述得足够清楚。确实,使用 GetActiveWindow() 可能不是最好的方法,但是有一种方法可以做你想做的事情

标签: c++ winapi


【解决方案1】:

您可以调用 GetActiveWindow 来获取应用程序中的活动控件,然后在返回的句柄上重复调用 GetParent 直到它返回 NULL。您获得的最后一个有效句柄应该是主窗口的句柄。

正如其他人所说,更简单的方法是将 CreateWindow 的返回值存储在某个地方。

【讨论】:

  • +1 用于实际回答问题。请记住,在很多情况下,这不会按您期望的方式或您想要的方式工作。如果可能,最好不要依赖 GetActiveWindow,除非您真正想要的是活动窗口。
【解决方案2】:

理解为什么没有简单的方法可能很好。这一切都归结为“哪个窗口?”。现在,您的屏幕上可能会显示多个窗口。例如,屏幕底部的任务栏是一个窗口。甚至您自己的应用程序通常也有不止一个。例如,“文件保存”对话框是一个窗口。即使是简单的MessageBox 也是一个窗口。

那么,您如何识别您正在谈论的哪个窗口?常见的答案是您通过他们的HWND 来识别他们。因此,要获取“文件保存”对话框窗口的位置,您需要询问与该 HWND 关联的位置。显然,您可以通过这种方式获得任何属性,除了HWND 本身!问HWND(0x5e21)的X/Y位置是有道理的,但问HWND属于HWND(0x5e21)是愚蠢的。

现在,您可能有另一个或多或少独特的属性,并且您想从中获取HWND。例如,您可能有一个 X/Y 位置。在这种情况下,WindowFromPoint(xy) 将在该位置返回 HWND

但最常见的情况是您需要对窗口的 Windows 消息做出反应。在这种情况下,您将窗口的HWND 作为WindowProc() 的第一个参数。

因此,除非您告诉我们您拥有哪些独特信息,否则我们无法告诉您如何找到匹配的HWND

【讨论】:

    【解决方案3】:

    您的窗口不是通过CreateWindow()CreateWindowEx() 创建的吗? CreateWindowEx() functionCreateWindow() 函数都返回新创建窗口的HWND

    此外,操作系统会将您的窗口via your window procedureHWND 传递给您。这不是您调用的函数;它是操作系统调用的一个函数,让您的应用程序执行所需的任何处理。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-27
      • 2021-08-09
      • 2011-01-21
      相关资源
      最近更新 更多