2012-11-13 39 views
3

我正在与操场SDK一起工作,需要获取我的游戏窗口的WNDCLASS。我没有在SDK中找到任何东西,这就是为什么我试图用游戏窗口的hWnd来做到这一点。那么有没有办法从HWND获取WNDCLASS? 我需要这个来更改游戏窗口中的系统光标如何从HWND获取WNDCLASS?

+1

只是好奇,但你为什么不能跟踪你传入'RegisterClass'数据? –

+0

@AdamRosenfield操场是一款适用于休闲游戏的跨平台SDK,它创建了一个窗口。 – IronMensan

+0

@ElDorado,想知道,因为通常不需要访问课程,你在做什么? – chris

回答

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::vector.data()&className[0]取代std::array,以及nullptrNULLGetClassInfo会返回一个WNDCLASS,如果你需要的,与其WNDCLASSEX

+0

如果我更改了WNDCLASS的某些属性,我必须如何保存它?像RegisterClassEx的东西?我试过只是改变他们,但它似乎并没有正确的工作(至少这个属性不保存) – ElDorado

+0

@ElDorado,你究竟在改变什么? – chris

+0

h游标属性 – ElDorado