Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Хук на скролл чужого окна - C++ WinAPI


Автор: korsaj 1.2.2018, 15:38
Подскажите, что я делаю не так. В ддл обрабатываю сообщения от скролла. При манипуляции со скроллами сообщение ловится, но значения nPos всегда хаотичные. Подозреваю что неправильно получаю структуру SCROLLINFO, но как именно неправильно ума не приложу. Ниже код ловушки из длл.
Код

LRESULT ScrollHookProc(int code, WPARAM wParam, LPARAM lParam )
{
    if (code < 0)
    {
        return CallNextHookEx(g_hHook, code, wParam, lParam);
    }
    
    if (code == MSGF_SCROLLBAR)
    {
        UINT Temp = pCW->message;
 
        SCROLLINFO *si = (SCROLLINFO*)lParam;
        int nPos = si->nPos;
 
        wchar_t buffer[256];
        wsprintfW(buffer, L"%d", nPos);
 
        if (Temp == SB_HORZ)
        {
            MessageBoxW(NULL, buffer, L"DllMain HSCROLL", MB_OK);
        }
        else if (Temp == SB_VERT)
        {
            MessageBoxW(NULL, buffer, L"DllMain VSCROLL", MB_OK);
        }
    }
    return ::CallNextHookEx(g_hMouseHook, code, wParam, lParam);
}

Автор: xvr 2.2.2018, 14:29
Если 'чужое окно' находится в другом приложении, то прочесть SCROLLINFO не получится. Аддрес в lParam будет для адресного пространства чужого приложения, у вас там будет что угодно. Для обработки таких хуков надо внедряться в это чужое приложение

Автор: korsaj 2.2.2018, 15:31
Цитата(xvr @ 2.2.2018,  14:29)
Для обработки таких хуков надо внедряться в это чужое приложение

Все сделано до вас. Вопрос был в другом и его решение найдено.

в LRESULT ScrollHookProc(int code, WPARAM wParam, LPARAM lParam ) первым делом получаем ссылку на структуру MSG,

MSG *msg = (MSG*)lParam;

а уже в ней храниться указатель на окно пославшее сообщение (в которое внедрена длл).

SCROLLINFO si;
ZeroMemory(&si, sizeof(si));
si.cbSize = sizeof(si);
si.fMask = SIF_ALL;
GetScrollInfo(msg->hwnd, SB_HORZ, &si));

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)