Re: HTMLayout and hooks
От: c-smile Канада http://terrainformatica.com
Дата: 26.11.07 19:30
Оценка:
Здравствуйте, ShaggyOwl, Вы писали:

SO>Привет!


SO>Дано (любое) HTMLayout приложение.

SO>Если к нему внедрить хук WH_CALLWNDPROC, то в приложении перестают работать popup и все что с ними связано tooltip, date, menu (содержание хука — открывается std::ofstream, в него пишется строка, поток закрывается)
SO>Выглядит странно. Это баг или нормальное поведение при модификации оконной процедуры?

Если меняю твою hook процедуру на:

// основа всего в этой dll :)
LRESULT WINAPI GetMsgProc(int nCode, WPARAM wParam, LPARAM lParam) 
{
    // не делаем ничего
    if ( nCode >= 0)
    {
        // lParam [in] Pointer to a CWPSTRUCT structure that contains details about the message. 
        // MSG
        CWPSTRUCT* cwp = (CWPSTRUCT*)lParam;
        ::MessageBeep(MB_OK);
        //std::ofstream qwe("some.log");
        //qwe << "hello" << std::endl;
        //qwe.close();
    }
    return CallNextHookEx(0, nCode, wParam, lParam);
}


То слышу MessageBeep и popup работают.
Если же есть файловая операция внутри:
std::ofstream qwe("some.log");
qwe.close();
то на popup окнах ничего не рисуется. Хотя код по отрисовке выполняется как с хуком так и без одинаково.
Причем рисую я на DC представляемой системой. Ощущуние что какая-то бага win32 системы.

Вот так например тоже все работает:

LRESULT WINAPI GetMsgProc(int nCode, WPARAM wParam, LPARAM lParam) 
{
    // не делаем ничего
    if ( nCode >= 0)
    {
        // lParam [in] Pointer to a CWPSTRUCT structure that contains details about the message. 
        // MSG
        CWPSTRUCT* cwp = (CWPSTRUCT*)lParam;
        if( cwp->message == WM_CREATE)
        {
             //::MessageBeep(MB_OK);
            std::ofstream qwe("some.log");
            qwe << "hello" << std::endl;
            qwe.close();
        }
    }
    return CallNextHookEx(0, nCode, wParam, lParam);
}


Похоже что file IO в каком-то конкретном msg не нравится системе.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.