Я пытаюсь предотвратить открытие окна диалога, открываемого MS Access, для того, чтобы зашифрованный файл accdb стал видимым. (Вместо этого я вводил пароль, используя API SendMessage через программу запуска).
Я попытался установить CBT_Hook, однако событие HCBT_MINMAX для диалогового окна не срабатывает так же, как другие обычные окна, т.е. Слово младшего порядка lParam не содержит ожидаемого значения окна просмотра (которое я мог бы затем переопределить). [Он работает как обычно для обычных окон].
Окно сначала создается как скрытое, поэтому модификация структуры CBT_CREATEWND в событии HCBT_CREATEWND не помогает. [Я пробовал настройку → cx и → cy до 0, но дочерние окна вызывают минимальный размер]
Я также попытался подклассифицировать диалоговое окно (как только HCBT_CREATEWND уволен, я подклассифицирую его), но после этого установка lParam в FALSE для сообщения WM_SHOWWINDOW не препятствовала отображению окна.
Я также попытался отменить (RETURN 0) большинство сообщений WM_, которые получало окно, например WM_ACTIVATE, WM_SHOWWINDOW и т.д., Но безрезультатно.
Отмена сообщения WM_NCCALCSIZE помогла, но это не мешало отображать дочерние окна, поэтому это действительно не помогает.
Есть идеи?
[В настоящее время, перед запуском Access, я перечисляю все окна каждые 10 мс, и как только я нахожу диалоговое окно с паролем, я отправляю ему сообщение, чтобы скрыть, но даже делая это каждые 10 мс заставляет его включать и отключать один раз, когда он Я хотел бы предотвратить это.
Запуск доступа с использованием скрытого стиля окна не помогает, поскольку основное приложение Access остается скрытым, но не диалоговым.]
Способ достижения этого (и другие подобные сценарии, чтобы скрыть диалоговое окно, созданное другим процессом при создании, выглядит следующим образом):
В подклассе CBT_Hook диалоговое окно, как только оно будет создано (CBT_CREATEWND будет запущен).
В функции подкласса окна установите первое окно прозрачного при первом вызове.
if (done != TRUE) {
LONG_PTR exstyle = GetWindowLongPtr(hwnd, GWL_EXSTYLE);
if (!(exstyle & WS_EX_LAYERED)) {
SetWindowLongPtr(hwnd, GWL_EXSTYLE, exstyle | WS_EX_LAYERED);
}
SetLayeredWindowAttributes(hwnd, 0, 0, LWA_ALPHA);
done = TRUE;
}
Теперь окно не будет мигать на экране.