Два вопроса.
1) Я понимаю, что это должен быть ожидаемый результат, но, возможно, кто-то может сказать мне, что я делаю неправильно;Я пытаюсь создать подкласс для всех оконных классов в глобальном хуке, и это работает, за исключением того, что я не могу закрыть магазин так, как должен, и когда программа, первоначально регистрирующая хук, отменяет регистрацию хука и выходит, приложения подклассов начинают падать.
Вот как я пытаюсь это сделать ..
// stores original wndprocs. In the hook dll, outside the shared memory.
map<HWND, WNDPROC> origWndProcs;
// in an EnumWindows callback, executed for all HWND's, also in the hook dll (UWM_REMOVE_HOOK is a registered unique message)
SendMessageTimeout(hWnd, UWM_REMOVE_HOOK, 0, 0, SMTO_ABORTIFHUNG | SMTO_NORMAL, 15000, res);
// Still in the same hook, in the subclassing wndproc..
if (msg == UWM_REMOVE_HOOK) {
if (origWndProcs.find(hwnd) != origWndProcs.end()) {
SetWindowLongPtr(hwnd, GWL_WNDPROC, (LONG_PTR)origWndProcs[hwnd]);
}
}
// clears the hook..
__declspec(dllexport) BOOL ClearHooks(HWND hWnd) {
BOOL unhooked = UnhookWindowsHookEx(hook) &&
UnhookWindowsHookEx(kb_hook) &&
UnhookWindowsHookEx(mouse_hook) &&
UnhookWindowsHookEx(cbt_hook);
if(unhooked)
hWndServer = NULL;
return unhooked;
}
В DllMain я ничего не делаю на DLL_PROCESS_DETACH.Вместо этого ClearHooks () вызывается из программы, первоначально регистрирующей перехватчики, и только после того, как перехватчик отправил сообщение, сигнализирующее о том, что он выполнил операцию EnumWindows (восстанавливает исходные wndprocs, см. Выше).
Окна подкласса Iв хуке WndProc;все видимые окна, которые получают сообщение и чей текущий wndproc не является тем в dll, подклассы.
В основном все (насколько я могу судить) приложения аварийно завершают работу при выходе, несмотря на то, что окна, кажется, действительновернуть wndproc к тому, что было, когда его заменили.Кто-нибудь знает, что я могу делать неправильно?
2) Мне нужно это перехватить WM_MINMAXINFO и изменить максимальный размер окна всякий раз, когда окно максимизируется.К сожалению, я не могу сделать это в DLL, но мне нужно поговорить с программой, чтобы получить информацию о размере.Итак, как лучше всего поговорить с этим окном;Мне нужно, чтобы передать некоторую информацию, чтобы я мог изменить структуру, которая пришла с оригинальным сообщением WM_MINMAXINFO.Сохранит ли структура в WM_COPYDATA свои данные до тех пор, пока не будет возвращен вызов SendMessageTimeout?
Спасибо