CreateDialog创建非模态对话框时 其内部 会发送几条消息例如: WM_INITDIALOG,WM_SETFONT DS_SETFONT , DS_SHELLFONT.
所以如果在另一个CallWndProc中调用CreateDailog时,有可能发生递归调用情况。
例如:你用 ::SetWindowsHookEx(WH_CALLWNDPROC, CallWndProc, NULL, thread_id) 的 CallWndProc里调用 CreateDailog时,就会发生递归的情况,最好的做法是利用一个变量来标识是否已经创建对话框
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
LRESULT CALLBACK CallWndProc(
_In_ int nCode,
_In_ WPARAM wParam,
_In_ LPARAM lParam
)
{ CWPSTRUCT * pMsg = (CWPSTRUCT *)lParam;
if (!g_my_wnd)
{
static bool created = false ;
if (!created)
{
created = true ;
g_my_wnd = CreateDialog(g_inst, MAKEINTRESOURCE(IDD_DIALOG_MAIN), NULL, DialogProc);
}
OutputDebugStr(L "CreateDialog sucess %d" , pMsg->message);
::ShowWindow(g_my_wnd, SW_SHOW);
}
return CallNextHookEx(g_hhook_wnd_proc, nCode, wParam, lParam);
} |