Проблемы с кросс-процессным подклассом - PullRequest
0 голосов
/ 16 октября 2010

Два вопроса.

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?

Спасибо

1 Ответ

0 голосов
/ 16 октября 2010

Здесь много болевых точек. Вы предполагаете, что никакой другой код не будет наследовать окно. И этот код выведет его из подкласса в правильном порядке. Там нет правильного порядка, ваш перехват является довольно асинхронным от выполнения программы.

Но, обходной путь достаточно прост. Вы уже подключились к SetWindowsHookEx, можете сделать еще один. WH_CALLWNDPROC или WH_CALLWNDPROCRET, в зависимости от того, что вы хотите сделать.

...