CBT_Hook, HCBT_MINMAX, событие или подкласс, чтобы скрыть диалоговое окно. C ++ в Windows

0

Я пытаюсь предотвратить открытие окна диалога, открываемого 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 остается скрытым, но не диалоговым.]

Теги:
event-handling
hook
messaging

1 ответ

0

Способ достижения этого (и другие подобные сценарии, чтобы скрыть диалоговое окно, созданное другим процессом при создании, выглядит следующим образом):

В подклассе 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;
    }

Теперь окно не будет мигать на экране.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню