Как заставить wndproc обрабатывать сообщения в нескольких окнах

Я пытался заставить 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;
}

-1

Решение

Ты говоришь,

«что я хотел бы сделать, это определить, какое окно получило WM_DESTROY или WM_CLOSE»

Ответ прост: окно, которое получает UINT message является HWND mainwin,

Если вы хотите знать «да, но какое из моих окон HWND mainwin? », тогда один из способов сделать это — когда вы создаете окно, вы запоминаете его дескриптор окна и сохраняете его где-то (например, в качестве глобальной переменной).


Кроме того, не понятно, почему вы звоните GetActiveWindow()ни то, что функциональность вы хотите реализовать.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]