如何从HWND获得WNDCLASS?

时间:2012-11-13 21:43:19

标签: c++ hwnd

我现在正在使用游乐场SDK,需要获得我游戏窗口的WNDCLASS。我还没有在SDK中找到任何东西,这就是为什么我试图用hWnd的游戏窗口来做这件事。那么有没有办法从HWND获得WNDCLASS? 我需要这个来改变游戏窗口中的系统光标

1 个答案:

答案 0 :(得分:5)

我不知道有问题的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()替换为&className[0],将nullptr替换为NULLGetClassInfo如果您需要WNDCLASS而不是WNDCLASSEX,则会返回{{1}}。