2011-11-12 30 views
0

所以我想知道在使用CreateWindow/CreateWindowEx創建窗口時返回的句柄與作爲參數傳遞給相關窗口的WNDPROC窗口回調過程之間是否存在差異。這個問題的上下文是我需要使用某些需要窗口句柄的API函數,所以我認爲不是傳遞窗口回調過程接收的句柄,而是保存CreateWindow返回的句柄的副本一次,然後將其用於後續操作,以防兩個手柄都相同。在WNDPROC窗口回調過程中收到的句柄與由CreateWindow返回的句柄之間的區別?

問候,

Devjeet

+0

你爲什麼不比較它們?另外你爲什麼不想使用窗口回調過程收到的那個? –

+0

這不是我不想要的,只是如果不通過它就可以做到,那會更好。我使用的功能僅用於一個目的,只有一個窗口過程會使用它。所以它認爲只要立即保存句柄,而不是一直傳遞它也會更簡單。 – devjeetroy

回答

2

在這裏要小心,窗口過程被一個窗口的多個實例使用。回調由WNDCLASSEX.lpfnWndProc的值決定,因此使用相同窗口類名的任何CreateWindow/Ex()調用使用相同的回調函數。如果您正在執行此操作以將回調映射到類實例方法,那麼您首先必須通過一個將回調的參數映射到類實例的thunk。當然,爲WM_CREATE做一個特例。

2

是的,他們都是一樣的,這是具有HWND的整點。每個窗口只有一個HWND,它在系統中標識它並保持有效,直到調用DestroyWindow。它由CreateWindow(EX)返回併發送給每個消息,以便您可以將它用作窗口的唯一標識符,即使您創建了多個相同類的窗口。

但是請注意,有些消息甚至CreateFunction返回之前發送到窗口的程序,所以如果你使用全局變量來保存你的HWND

HWND globalHwnd = NULL; 

int main() 
{ 
    //... 
    globalHwnd = CreateWindow(...); 
} 

LRESULT WndProc(HWND hWnd, ...) 
{ 
    assert(hWnd == globalHwnd); //fail! 
} 

斷言會失敗,因爲一些消息,比如WM_CREATECreateWindow返回之前發送,所以全局變量尚未分配。

+0

謝謝!順便說一句,我會用它作爲一個類的成員。 – devjeetroy