Вопрос

Два вопроса.

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, см. Выше).

Я подкласс окна в крюке WNDProc; Все видимые окна, которые получают сообщение и текущий WNDProc, не тот, кто в DLL, подклассы.

В основном все (насколько я могу сказать) приложения, прилагаемые к выходу, несмотря на то, что Windows, кажется, заставит WNDPROC обратно, к тому, что он был, когда он был заменен. У кого-нибудь есть подсказка, что я мог бы сделать неправильно?

2) Мне нужно это перехватить WM_MINMAXINFO и изменить окно Maxsize всякий раз, когда окно максимизируется. К сожалению, я не могу сделать это в DLL, но я должен поговорить с программой, чтобы получить информацию о размере. Итак, как лучший способ поговорить с этим окном; Мне нужно, чтобы он перебрал некоторую информацию, чтобы я мог изменить структуру, которая пришла с оригинальным сообщением WM_MINMAXINFO. Будет ли структура в WM_Copydata сохраняет ее данные до вызова SendMessageTimeout возвращается?

Спасибо

Это было полезно?

Решение

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top