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


Автор: TGrey 17.6.2010, 12:55
Здравствуйте, что-то пригорело мне увеличить ширину системных часов в трее, добрался до них, пытался двигать - двигаются, но остальное не сдвигается относительно них. Потом пробовал двигать сам трей, тоже двигается, но не то, что мне надо. Почитал в инете, нашел что нужно отлавливать сообщения WM_USER+100 которое шлется часам, для того, чтобы узнать их размер. Попытался сам слать его, но часам до него нет дела, значит нужно возвращать результатом их размер? Сунул глобальный хук в систему на сообщение WM_USER+100, а оно почему-то не обрабатывается, не видит оно его, в Спайхх все сообщения проходят, а ДЛЛ 0 внимания.
Можете подсказать в чем проблема и может, кто-то уже занимался подобной ерундой.
Спасибо.

Код


#pragma data_seg(".sh")
HHOOK hook = 0;
#pragma data_seg()

#pragma comment(linker, "/section:.sh, rws")


HINSTANCE hin;

int APIENTRY DllMain (HINSTANCE hInstance, DWORD fdwReason, PVOID pvReserved){
    switch (fdwReason)
    {
        case DLL_PROCESS_ATTACH :
            hin = hInstance ;
            break ;
    }  
    return TRUE ;
}

extern "C" __declspec(dllexport) bool TurnON(HWND h)
{
    hm = h;
    //cout<<"Hook ON"<<endl;
    MessageBox(NULL, "Hook ON", "ON", 0);
    hook = SetWindowsHookEx(WH_GETMESSAGE, HookProc,hin, NULL);
    return true;
}

LRESULT CALLBACK HookProc( int nCode, WPARAM wParam,LPARAM lParam)
{
    MSG * st = (MSG*)lParam;
    if( nCode == HC_ACTION )
    {
                if( st->message == 0x0464 )
        {
            MessageBox(NULL, "clock", "ON", 0);
            //st->lParam= 0;
            //st->wParam = 0;
        }
    }
    else
    {
            //MessageBox(NULL, "BAD", "ON", 0);
        return CallNextHookEx(hook, nCode, wParam, lParam);
    }
    return CallNextHookEx(hook, nCode, wParam, lParam);
}

Автор: TGrey 17.6.2010, 18:11
Пока сидел, решил побаловаться, с ПУСКом, заделал свою кнопку и пытался вызвать оконную процедуру ПУСКа при сообщении от кнопки мыши, почти работает, но недостаток по прежнему в том, что Shell_TrayWnd сообщения никак не воспринимаются хуком.
Я просмотрел и увидел, что на часы и на его парентов стоит одна и таже процедура окна, я так понял, что ее надо заменять на свою, а потом вызывать стандартную, но вопрос остается, как принимать хоть какие-то сообщения, если они вообще не воспринимаются от этих компонентов?

Автор: GremlinProg 18.6.2010, 09:39
код не разбирал, но увидел работу с WH_GETMESSAGE,
не думаю что такие сообщения часто укладываются в очередь, обычно вызывается простой SendMessage,
так что наверное стоит заглянуть и в WH_CALLWNDPROC

Автор: TGrey 19.6.2010, 21:33
Пробовал, дело в том, что у меня почему-то от ШеллТрея(если не ошибаюсь) вообще никакие сообщения не идут. Я сдвигаю к примеру часы или панель с иконками куда-то под экран- пытался ловить сообщения  о кликах и т.д. Так ничего и не словилось, словилось только тогда, когда клацаю по кнопке со стролочкой, которая расскрывает список спрятаных иконок, тогда идет сообщение о клике мышой, а иначе - глухо.

Как смогу еще раз проверю, может я пробовал с WH_GETMESSAGE. Но всеже если у кого есть еще идеи, буду рад.

Автор: TGrey 20.6.2010, 00:13
В общем вот что получилось, если хукаю по КоллВндПрок, то при клике по иконкам приложений крашится Експлорер, при клике по ШеллТрею - ничего.
Если хукаю по ГетМесседж, то при кликах в Ехплорере и при кликах в области часов(но не на часах) и по кнопке выдвинуть спрятанные иконки и по квадратику для выбора языка, сообщения проходят, а при клике по ШеллТрею - 0 внимания. Не хочет оно сообщения ловить.


------------------
Моя ошибка, выключил в Спайхх нужные сообщения в фильтре и не видел, что хукаю не то, что надо.
Код

    hook = SetWindowsHookEx(WH_GETMESSAGE, HookProc,hin, 0);
....
        else if( st->message == WM_NCLBUTTONDOWN )
....

Работает, ловит, то что мне надо.


Извиняюсь отдалился от темы, с ПУСКом, то работает, а насчет часов вопрос остается открытым. Сообщение WM_USER+100 по прежнему не ловятся от него.

Автор: TGrey 25.6.2010, 12:09
Теперь на счет WM_USER+100, в другой теме было решено, что я использовал не верную структуру для хука WH_CALLWNDPROC, подставив нужную структуру, сообщение хукается нормально, но размер, что-то не горит изменятся=)

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