Я пытался заставить wndproc успешно получать сообщения из очереди сообщений и обрабатывать их в соответствии с моим кодом, но это не работает так, как я хочу, что я хотел бы сделать, это определить, какое окно получено WM_DESTROY или WM_CLOSE и код вызова, специфичный для того, какое окно было закрыто, но по какой-то причине в данный момент оно ничего не делает. После долгих экспериментов я заставил его функционировать частично по-разному, но кажется, что каждая реализация функционирует не совсем правильно. Вот мой последний неудачный код:
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;
}
Ты говоришь,
«что я хотел бы сделать, это определить, какое окно получило WM_DESTROY или WM_CLOSE»
Ответ прост: окно, которое получает UINT message
является HWND mainwin
,
Если вы хотите знать «да, но какое из моих окон HWND mainwin
? », тогда один из способов сделать это — когда вы создаете окно, вы запоминаете его дескриптор окна и сохраняете его где-то (например, в качестве глобальной переменной).
Кроме того, не понятно, почему вы звоните GetActiveWindow()
ни то, что функциональность вы хотите реализовать.
Других решений пока нет …