所以我想知道在使用CreateWindow/CreateWindowEx
創建窗口時返回的句柄與作爲參數傳遞給相關窗口的WNDPROC
窗口回調過程之間是否存在差異。這個問題的上下文是我需要使用某些需要窗口句柄的API函數,所以我認爲不是傳遞窗口回調過程接收的句柄,而是保存CreateWindow返回的句柄的副本一次,然後將其用於後續操作,以防兩個手柄都相同。在WNDPROC窗口回調過程中收到的句柄與由CreateWindow返回的句柄之間的區別?
問候,
Devjeet
所以我想知道在使用CreateWindow/CreateWindowEx
創建窗口時返回的句柄與作爲參數傳遞給相關窗口的WNDPROC
窗口回調過程之間是否存在差異。這個問題的上下文是我需要使用某些需要窗口句柄的API函數,所以我認爲不是傳遞窗口回調過程接收的句柄,而是保存CreateWindow返回的句柄的副本一次,然後將其用於後續操作,以防兩個手柄都相同。在WNDPROC窗口回調過程中收到的句柄與由CreateWindow返回的句柄之間的區別?
問候,
Devjeet
在這裏要小心,窗口過程被一個窗口的多個實例使用。回調由WNDCLASSEX.lpfnWndProc的值決定,因此使用相同窗口類名的任何CreateWindow/Ex()調用使用相同的回調函數。如果您正在執行此操作以將回調映射到類實例方法,那麼您首先必須通過一個將回調的參數映射到類實例的thunk。當然,爲WM_CREATE做一個特例。
是的,他們都是一樣的,這是具有HWND的整點。每個窗口只有一個HWND
,它在系統中標識它並保持有效,直到調用DestroyWindow
。它由CreateWindow(EX)
返回併發送給每個消息,以便您可以將它用作窗口的唯一標識符,即使您創建了多個相同類的窗口。
但是請注意,有些消息甚至CreateFunction
返回之前發送到窗口的程序,所以如果你使用全局變量來保存你的HWND
:
HWND globalHwnd = NULL;
int main()
{
//...
globalHwnd = CreateWindow(...);
}
LRESULT WndProc(HWND hWnd, ...)
{
assert(hWnd == globalHwnd); //fail!
}
斷言會失敗,因爲一些消息,比如WM_CREATE
在CreateWindow
返回之前發送,所以全局變量尚未分配。
謝謝!順便說一句,我會用它作爲一個類的成員。 – devjeetroy
你爲什麼不比較它們?另外你爲什麼不想使用窗口回調過程收到的那個? –
這不是我不想要的,只是如果不通過它就可以做到,那會更好。我使用的功能僅用於一個目的,只有一個窗口過程會使用它。所以它認爲只要立即保存句柄,而不是一直傳遞它也會更簡單。 – devjeetroy