У меня проблемы с подключением к глобальной системе. Я хочу получать уведомления, когда окно перемещается, как можно раньше, и изменять размер окна. Это означает, что крюк CBT HCBT_MOVESIZE
не будет разрезать его, это происходит только после перемещения окна. Я хочу зафиксировать фактическое движение окна и иметь возможность изменять размер окна во время перемещения.
Хуки устанавливаются из DLL, а функция обратного вызова находится внутри этой DLL. Это то, что я пробовал.
WH_CALLWNDPROC
. Он предупреждает меня, когда окно перемещается (WM_MOVING
получено для окон из других приложений), но я не могу изменить содержимое сообщения.
WH_CALLWNDPROCRET
То же, что и WH_CALLWNDPROC
.
- CBT крюк
HCBT_MOVESIZE
. Событие происходит с опозданием.
WH_GETMESSAGE
. Никогда не получайте WM_MOVE
, WM_MOVING
или WM_WINDOWPOSCHANGING
. Этот хук позволит мне изменить сообщения.
Обновление : кажется, что перехватчики событий Windows позволяют мне его захватывать:
hWinEventHook = SetWinEventHook(EVENT_SYSTEM_MOVESIZESTART,
EVENT_SYSTEM_MOVESIZEEND, NULL, WinEventProc,
0, 0, WINEVENT_OUTOFCONTEXT | WINEVENT_SKIPOWNPROCESS);
Однако это создает другую проблему: изменение размера окна с помощью SetWindowPos()
не работает (оно меняет размер в порядке, но сразу же возвращается к его предыдущему размеру), даже если я использую SWP_NOSENDCHANGING
. Идеи?
Обновление 2 : кажется, что подклассы работают, но Visual Studio падает после каждого запуска программы (как и многие другие окна). Это хорошо работает, если я устанавливаю точки останова и прохожу через «отмену подклассов», но не тогда, когда я запускаю программу самостоятельно. Идеи?
У меня есть хук CBT (он был там раньше), и всякий раз, когда HCBT_ACTIVATE
отправляется для нового окна, я удаляю все предыдущие подклассы, используя SetWindowLongPtr()
(это также должно работать на 64-битной версии), а затем создать подкласс нового окна. Если я ставлю точку останова где-нибудь и сразу возобновляю сеанс, когда он прерывается, все работает нормально. Однако, когда у меня нет точек останова, Visual Studio аварийно завершает работу при выходе из программы.