如何从HWND获得WNDCLASS?

ElD*_*ado 3 c++ hwnd

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

chr*_*ris 5

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


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

使用SetClassLongPtr功能:

SetClassLongPtr(hwnd, GCLP_HCURSOR, reinterpret_cast<LONG_PTR>(newCursorHandle));
Run Code Online (Sandbox Code Playgroud)

要仅改变游戏窗口的光标:

首先,有一条WM_SETCURSOR消息可以处理,以控制窗口中显示的光标.您可以在下面的Adam Rosenfield的评论中阅读更多相关内容.

除此之外,还有另一种选择:根据SetCursor文档,首先确保将类的光标设置为nothing(NULL).然后,SetCursor当鼠标进入和离开客户区时,您可以使用该功能.为了不干扰类中的其他窗口,请确保在鼠标输入时将类光标设置为NULL并将其设置回鼠标退出时的状态.

otherCursor = SetCursor(otherCursor);
Run Code Online (Sandbox Code Playgroud)

要获得与窗口关联的只读WNDCLASSEX:

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

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

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

WNDCLASSEX wce;
GetClassInfoEx(GetModuleHandle(nullptr), className.data(), &wce);
Run Code Online (Sandbox Code Playgroud)

现在您可以访问wce以读取类结构的内容.如果需要,可以替换std::array使用std::vector,并.data()&className[0],以及nullptrNULL.如果您需要,GetClassInfo则返回a WNDCLASS而不是WNDCLASSEX.

  • @ElDorado:如果要更改窗口的光标,最好覆盖其窗口过程的[`WM_SETCURSOR`](http://msdn.microsoft.com/en-us/library/windows/desktop/ms648382%28v = vs.85%29.aspx)消息处理程序.如果您无法更改窗口过程,则可以[子类化](http://msdn.microsoft.com/en-us/library/windows/desktop/ms633570%28v=vs.85%29.aspx#subclassing_window )而不是. (2认同)