Модераторы: feodorv, GremlinProg, xvr, Fixin

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Hook && WM_ERASEBKGND 
:(
    Опции темы
TGrey
Дата 20.6.2010, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 294
Регистрация: 1.12.2007

Репутация: 1
Всего: 1



Здравствуйте, рисую в контексте другого окна свою картинку, но временами, другое приложение вызывает очистку фона, что создает блики моей картинки. Проверку отрисовки своей картинки я выполняю через хук окна в котором нужно рисовать. Мне интересно, как из хука запретить стирать фон? Я же не могу вернуть ложь, нужно вызывать след. хук?!
PM MAIL   Вверх
GremlinProg
Дата 23.6.2010, 10:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата(TGrey @  20.6.2010,  16:22 Найти цитируемый пост)
Я же не могу вернуть ложь, нужно вызывать след. хук?!

а кто мешает?


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
TGrey
Дата 23.6.2010, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 294
Регистрация: 1.12.2007

Репутация: 1
Всего: 1



Все равно, Спай++ показывает, что что ШеллТрей принимает\отсылает очистку фона с true.
А мой хук это сообщение вообще не видит.
Код

extern "C" __declspec(dllexport) bool TurnON()
{
    //MessageBox(NULL, "Hook ON", "ON", 0);
    HWND hTray = FindWindow( "Shell_TrayWnd", 0);
    hook = SetWindowsHookEx(WH_GETMESSAGE, HookProc,hin, GetWindowThreadProcessId(hTray, &dw));
    return true;
}

LRESULT CALLBACK HookProc( int nCode, WPARAM wParam,LPARAM lParam)
{
    MSG * st = (MSG*)lParam;
    HWND hTray, start, trayn;

    hTray = FindWindow( "Shell_TrayWnd", 0);
    if( nCode == HC_ACTION )
    {
         if( st->message == WM_ERASEBKGND  )
        {
            //MessageBox(0, "222", "a",0);
            CallNextHookEx(hook, nCode, wParam, lParam);
            return false;
        }
        else if( st->message == WM_NCLBUTTONDOWN  )
        {
            //SendMessage(hTray, WM_USER+100, 0, 0);
            MessageBox(0, "111l", "a",0);
        }
    }
    return CallNextHookEx(hook, nCode, wParam, lParam);
}

WM_NCLBUTTONDOWN - хукается, сообщение выводится, а очистка фона - нет.
PM MAIL   Вверх
Earnest
Дата 23.6.2010, 20:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 33
Всего: 183



Скорее всего, WM_GETMESSAGE здсь не годится. Насколько я помню, ERASEBACKGND не через очередь приходит, а прямо. Т.е. нужен другой хук.


--------------------
...
PM   Вверх
TGrey
Дата 23.6.2010, 22:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 294
Регистрация: 1.12.2007

Репутация: 1
Всего: 1



А что мне хукать тогда?
PM MAIL   Вверх
Earnest
Дата 24.6.2010, 09:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 33
Всего: 183



Попробуй WH_CALLWNDPROC


--------------------
...
PM   Вверх
TGrey
Дата 24.6.2010, 13:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 294
Регистрация: 1.12.2007

Репутация: 1
Всего: 1



На это сообщение, тоже, ничего ловить не хочет.
PM MAIL   Вверх
Earnest
Дата 24.6.2010, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 33
Всего: 183



Не сообщение, а тип хука, который ты ставишь в SetWindowsHookEx. 


--------------------
...
PM   Вверх
TGrey
Дата 24.6.2010, 20:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 294
Регистрация: 1.12.2007

Репутация: 1
Всего: 1



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

extern "C" __declspec(dllexport) bool TurnON()
{
    //MessageBox(NULL, "Hook ON", "ON", 0);
    HWND hTray = FindWindow( "Shell_TrayWnd", 0);
    HWND trayn = FindWindowEx( hTray, NULL, "TrayNotifyWnd", 0);
    DWORD dw;
    //hook = SetWindowsHookEx(WH_GETMESSAGE, HookProc,hin, GetWindowThreadProcessId(hTray, &dw));
    hook = SetWindowsHookEx(WH_CALLWNDPROC, HookProc,hin, GetWindowThreadProcessId(hTray, &dw));
    return true;
}

extern "C" __declspec(dllexport) bool TurnOFF()
{
    UnhookWindowsHookEx(hook);
    return true;
}

LRESULT CALLBACK HookProc( int nCode, WPARAM wParam,LPARAM lParam)
{
    MSG * st = (MSG*)lParam;
    HWND hTray, start, trayn;
    if( nCode == HC_ACTION )
    {
         if( st->message == WM_ERASEBKGND  )
        {
            MessageBox(0, "фф", "a",0);
            //CallNextHookEx(hook, nCode, wParam, lParam);
            //return false;
        }
        else if( st->message == WM_NCLBUTTONDOWN  )
        {
            MessageBox(0, "вв", "a",0);
        }
    }
    return CallNextHookEx(hook, nCode, wParam, lParam);
}

PM MAIL   Вверх
Earnest
Дата 25.6.2010, 06:14 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 33
Всего: 183



Цитата(TGrey @  24.6.2010,  21:23 Найти цитируемый пост)
 MSG * st = (MSG*)lParam;

Посмотри в MSDN, как параметры нужно распаковывать.У каждого хука по своему.


--------------------
...
PM   Вверх
TGrey
Дата 25.6.2010, 11:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 294
Регистрация: 1.12.2007

Репутация: 1
Всего: 1



Да я понял, использовал не ту структуру. Хорошо, сейчас ловит, но как запретить то перерисовку?
Код

    CWPSTRUCT *st2 = (CWPSTRUCT*)lParam;

    if( nCode == HC_ACTION )
    {
         if( st2->message == WM_ERASEBKGND  )
        {
            //CallNextHookEx(hook, nCode, wParam, lParam);
            return false;
        }

Не очень помогает.
Если до хука сообщения выглядят как
WM_ERASEBKGND hdc:<........>
WM_ERASEBKGND fErased: True
То после хука
WM_ERASEBKGND fErased: True

В итоге моя картинка по прежнему мигает.
PM MAIL   Вверх
GremlinProg
Дата 25.6.2010, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата(TGrey @  25.6.2010,  13:16 Найти цитируемый пост)
return false;

return TRUE;
Цитата(WM_ERASEBKGND Notification @  MSDN)

An application should return nonzero if it erases the background; otherwise, it should return zero. 


Добавлено через 4 минуты
только это не поможет, если приложение само заливает фон на WM_PAINT


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
TGrey
Дата 25.6.2010, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 294
Регистрация: 1.12.2007

Репутация: 1
Всего: 1



Кстати да, пробовал я и Истину возвращать. Видимо оно так и делает.
А как можно организовать хук сообщение и очистки фона и прорисовки? Я понимаю, что прорисовку нужно же ловить на WH_GETMESSAGE. Или если можно и через WH_CALLWNDPROC, то смысл было делать разные способы?
PM MAIL   Вверх
GremlinProg
Дата 25.6.2010, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



несколькими хуками,
WH_CALLWNDPROC и WH_GETMESSAGE - не разные сами по себе,
просто они приложены в разных местах, поэтому есть шанс пропустить сообщение, если не реализовать оба,

к примеру такая посылка 2-х сообщений:
Код

SendMessage( hwnd, WM_USER + 123, ... );
PostMessage( hwnd, WM_USER + 123, ... );

будет перехвачена разными хуками


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
TGrey
Дата 25.6.2010, 12:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 294
Регистрация: 1.12.2007

Репутация: 1
Всего: 1



Ну то есть из одной ДЛЛ можно подряд создать 2 хука и 2 процедуры фильтра, запустить и все будет нормально работать?
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0537 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.