【问题标题】:How to get WNDCLASS from HWND?如何从 HWND 获取 WNDCLASS?
【发布时间】:2012-11-13 21:43:19
【问题描述】:

我现在正在使用 Playground SDK,需要获取我的游戏窗口的 WNDCLASS。我在 SDK 中没有找到任何东西,这就是为什么我试图用游戏窗口的 hWnd 来做到这一点。那么有什么方法可以从 HWND 获取 WNDCLASS 吗? 我需要这个来改变游戏窗口中的系统光标

【问题讨论】:

  • 只是好奇,但您为什么不能跟踪您传递给RegisterClass 的数据?
  • @AdamRosenfield playground 是一个用于休闲游戏的跨平台 SDK,它会创建窗口。
  • @ElDorado,只是想知道,由于通常不需要访问该课程,您在用它做什么?
  • @chris 我不知道 OP 打算对课程做什么。
  • @IronMensan,糟糕,找错人了:p

标签: c++ hwnd


【解决方案1】:

我不知道有问题的 SDK,但只要它提供对本机 HWND 类型的访问,您就可以使用本机调用。


更改该类所有窗口的光标:

使用SetClassLongPtr函数:

SetClassLongPtr(hwnd, GCLP_HCURSOR, reinterpret_cast<LONG_PTR>(newCursorHandle));

仅更改游戏窗口的光标:

首先,您可以处理WM_SETCURSOR 消息来控制窗口中显示的光标。您可以在下面 Adam Rosenfield 的评论中了解更多信息。

除此之外,还有另一种选择:根据SetCursor 文档,首先确保将类的光标设置为空(NULL)。然后就可以在鼠标进出客户区时使用SetCursor函数了。为了不干扰类中的其他窗口,请务必在鼠标进入时将类光标设置为 NULL,然后将其设置回鼠标退出时的状态。

otherCursor = SetCursor(otherCursor);

获取与窗口关联的只读 WNDCLASSEX:

首先,使用GetClassName获取与窗口关联的类的名称:

std::array<TCHAR, 256> className; //256 is max classname length
GetClassName(hwnd, className.data(), className.size());

然后,在调用 GetClassInfoEx 时使用它:

WNDCLASSEX wce;
GetClassInfoEx(GetModuleHandle(nullptr), className.data(), &wce);

现在您可以访问wce 来读取类结构的内容。如果需要,可以将std::array 替换为std::vector,将.data() 替换为&amp;className[0],以及将nullptr 替换为NULL。如果需要,GetClassInfo 将返回 WNDCLASS,而不是 WNDCLASSEX

【讨论】:

  • 如果我改变了WNDCLASS的一些属性,我该如何保存呢?像RegisterClassEx这样的东西?我只尝试更改它们,但似乎无法正常工作(至少没有保存此属性)
  • @ElDorado,你到底要改变什么?
  • @ElDorado,我已经更新了我的答案,以反映人们可能需要的不同可能性。
  • 似乎不起作用。看起来 Playground 正在将光标更改回系统。由于this 信息,我尝试将.hCursor 设置为NULL。看起来它值得新发布,因为这种方式行不通。无论如何,非常感谢,我从您的回复中学到了一些东西
  • @ElDorado:如果要更改窗口的光标,最好覆盖其窗口过程的WM_SETCURSOR 消息处理程序。如果不能更改窗口过程,可以subclass it代替。
猜你喜欢
  • 2011-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-07
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
  • 2020-02-03
相关资源
最近更新 更多