-1
我一直在試圖讓wndproc成功接收來自消息隊列的消息,並根據我的代碼處理它們,但它並不按照我希望的方式工作,我想要做的是確定哪個窗口收到了WM_DESTROY或WM_CLOSE以及特定於哪個窗口關閉的調用代碼,但由於某種原因,此時它什麼都不做。經過大量的實驗後,我已經以不同的方式部分發揮作用,但似乎每個實現都不能正確運行。這裏是我的最新的成功代碼:如何讓wndproc處理消息到多個窗口
while (GetMessage (&messages, NULL, 0, 0))
{
/* Translate virtual-key messages into character messages */
TranslateMessage(&messages);
/* Send message to WindowProcedure */
DispatchMessage(&messages);
}
/* The program return-value is 0 - The value that PostQuitMessage() gave */
return messages.wParam;
}
/* This function is called by the Windows function DispatchMessage() */
LRESULT CALLBACK Proc2(HWND mainwin, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message) /* handle the messages */
{
case WM_DESTROY:
const HWND active_window = GetActiveWindow();
if (active_window == mainwin)
{
PostQuitMessage(0);
}
if (active_window == hwnd2)
{
PostQuitMessage(0);
EnableWindow (mainwin, true);
}
break;
}
switch (wParam) /* handle the messages */
{
case ID_2 :
PostQuitMessage(0);
break;
case ID_1 :
ShowWindow (hwnd2, SW_SHOW);
break;
default: /* for messages that we don't deal with */
return DefWindowProc (mainwin, message, wParam, lParam);
break;
}
return 0;
}
這裏是我有多個窗口程序
while (GetMessage (&messages, NULL, 0, 0))
{
/* Translate virtual-key messages into character messages */
TranslateMessage(&messages);
/* Send message to WindowProcedure */
DispatchMessage(&messages);
}
/* The program return-value is 0 - The value that PostQuitMessage() gave */
return messages.wParam;
}
/* This function is called by the Windows function DispatchMessage() */
LRESULT CALLBACK Proc2(HWND mainwin, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message) /* handle the messages */
{
case WM_DESTROY:
PostQuitMessage(0);
break;
}
switch (wParam) /* handle the messages */
{
case ID_2 :
PostQuitMessage(0);
break;
case ID_1 :
ShowWindow (hwnd2, SW_SHOW);
break;
default: /* for messages that we don't deal with */
return DefWindowProc (mainwin, message, wParam, lParam);
break;
}
return 0;
}
LRESULT CALLBACK Proc3(HWND hwnd2, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_DESTROY:
EnableWindow (mainwin, false);
break;
case WM_CLOSE:
EnableWindow (mainwin, false);
break;
}
switch (wParam)
{
default:
return DefWindowProc (hwnd2, message, wParam, lParam);
break;
}
return 0;
}
CW因爲這不是一個很大的答案,但我認爲它太長才能發表評論,要求澄清這個問題。 – ChrisW
你是說,因爲wndproc是要讓mainwin只有mainwin產生的消息(比如點擊窗口右上角的x)會去到那個wndproc?那麼我是否必須創建一個secodn wndproc?我試過了,它看起來像我的消息從第二個窗口hwnd2仍然去了第一個wndproc,getactivewindow的原因是因爲我認爲WM_DESTROY將發送到該wndproc無論哪個窗口生成的消息,所以我應該用它來確定哪個窗口生成了消息。我將編輯我的q以包含雙wndproc failcode – user1882226
@ user1882226您在創建窗口時指定wndproc。如果使用相同的wndproc創建兩個窗口,那麼相同的wndproc將用於這兩個窗口。當wndproc被調用時,HWND參數會告訴你這兩個窗口中的哪一個正在接收消息。或者,您可以爲不同的窗口使用不同的wndproc。 wndproc就像一個C++類,HWND就像這個類的C++實例。如果你有兩個稍微不同的窗口行爲,你可以定義兩個稍微不同的wndprocs,它們都委託給一個公共的子例程來處理...... – ChrisW