"Онемение" модальных диалогов после SetForegroundWindow
От: CoPut  
Дата: 28.06.05 06:38
Оценка:
Второй день рою инет и никак не мгу найти ответ на вопрос:
Есть невидимое окно, необходимое только для получения сообщений от иконки в трее и от менюхи, выскакивающий по нажатию правой кнопкой на тойже иконке. Чтобы небыло проблем с исчезновением менюхи, делаю то, что говорят в MSDN:
SetForegroundWindow(hWnd);
TrackPopupMenu(hSubMenu, 0, x, y, 0, hWnd, NULL);
PostMessage(hWnd, WM_NULL, 0, 0);

К моменту выхода из меню в очереди сообщенй лежит сообщение о клике на пункте меню. Реакцией на него будет создание модального диалога.
HINSTANCE hInst = (HINSTANCE)GetModuleHandle(NULL);
return (int)DialogBoxParam(hInst, res, NULL, (DLGPROC)mainDialogProc, LPARAM(index));

Здесь происходит странное, модальный диалог появляется, но серый и никак не реагирует на внешние раздрожители. Разве что, можно его тоскать за заголовок. При этом, его даже неьзя закрыть — элементы управления не реагируют.
Re: "Онемение" модальных диалогов после SetForegroundWindow
От: CoPut  
Дата: 28.06.05 10:43
Оценка:
Проблема решилась перенаправлением не обработаных сообщений в DefWindowProc. Видимо необходимо было реагиорвать на какие-то сообщения, только я не понял пока какие.
Re: "Онемение" модальных диалогов после SetForegroundWindow
От: EyeOfHell  
Дата: 28.06.05 11:03
Оценка:
Здравствуйте


Здесь происходит странное, модальный диалог появляется, но серый и никак не реагирует на внешние раздрожители. Разве что, можно его тоскать за заголовок. При этом, его даже неьзя закрыть — элементы управления не реагируют.


Для того, чтобы диалог был интерактивный, должны выполняться два условия:

1. Функция обработчик, указанная при создании диалога, должна на необрабатываемые ей сообщения (а таких большинство) возвращать FALSE (тоесть 0), дабы эти сообщения обработала система.

2. В том же потоке, где был создан диалог, должна происходить обработка сообщений потока:

MSG oMsg;
while(BOOL nRet = ::GetMessage(&oMsg, 0, 0, 0) && -1!=nRet)
{
::TranslateMessage(&oMsg);
::DispatchMessage(&oMsg);
}

С уважением, Григорий.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.