2012-11-13 74 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