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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> global HCBT_Active hook, помогите написать 
:(
    Опции темы
fromrus
Дата 7.9.2008, 20:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Задали написать хук активации окна,точнее чтоб при регистрации хука другие окна в системе активироывать было нельзя.Пишу длл(ВС 2008):
Код

HHOOK hook;

LRESULT CALLBACK HCBT_ACTIVATE(int nCode ,WPARAM wParam ,LPARAM lParam);

//вот и функция-фильтр
LRESULT CALLBACK HCBT_ACTIVATE(int nCode,WPARAM wParam,LPARAM lParam)
{
    if(code<0)
        return CallNextHookEx(hook,nCode,wParam,lParam);
    if(nCode==HCBT_ACTIVATE)
    {
        //Понятия не имею,что писать сюды
    }
return  CallNextHookEx(hook, nCode, wParam, lParam);
}

В с++ не разбираююсь,поэтому прошу помощи у знающих людей...Или объясните мне логику вызова/регистрации этого хука,Плз!Спасибо!
PM MAIL ICQ   Вверх
ama_kid
Дата 8.9.2008, 08:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


Профиль
Группа: Комодератор
Сообщений: 1460
Регистрация: 5.3.2007
Где: Москва

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



Цитата(fromrus @  7.9.2008,  21:18 Найти цитируемый пост)
Код
//Понятия не имею,что писать сюды
Цитата(МСДН(http://msdn.microsoft.com/en-us/library/ms644977.aspx))
... the return value must be 0 to allow the operation, or 1 to prevent it
т.е. для того, чтобы предотвратить активизацию окна, необходимо вернуть не-ноль:
Код
return 1;

Цитата(fromrus @  7.9.2008,  21:18 Найти цитируемый пост)
объясните мне логику вызова/регистрации этого хука
Статей на эту тему море и маленькая тележка... Попробую в двух словах:
1) Организовываешь в dll-библиотеке две экспортируемые функции по установке и снятию хуковой функции.
2) В хуковой функции (она тоже располагается в dll) организуешь логику работы хука по глобальному взаимодействию с системой. В данном случае - просто вернуть не-ноль при получении HCBT_ACTIVATE.
3) В своем приложении организуешь вызов функции установки хука. Пока твое приложение работает, в адресное пространство всех процессов системы будет подгружаться хуковая функция из твоей библиотеке.
4) По завершению работы приложения - вызываешь функцию по снятию хука. Все...



--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
fromrus
Дата 10.9.2008, 09:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



помучился и написал,но не работает(писал в Билдере):
//Проедура вызова хука
Код

LRESULT CALLBACK MyCBTHookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    if(nCode<0)
    {
       CallNextHookEx(hook, nCode, wParam, lParam);
       return 0;
    }

   if(nCode==HCBT_ACTIVATE)
        return 1;

return CallNextHookEx(hook,nCode,wParam,lParam);

}

//В оьраьотчике кнопки хук должен регистрироваться
Код

void __fastcall TForm1::Button1Click(TObject *Sender)
{
    hook=SetWindowsHookEx(WH_CBT,(HOOKPROC)MyCBTHookProc,hInstance,0);

}

//Ну и при нажатии на другую кнопку хук деактивируется
Код

void __fastcall TForm1::Button2Click(TObject *Sender)
{
     UnhookWindowsHookEx(hook);

}

Дело в том,что при нажатии на Батон1 нет никакой реакции-из-за чего ?
PM MAIL ICQ   Вверх
fromrus
Дата 10.9.2008, 23:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



точнее сделал следущее:

//ДЛЛ
Код

#include "stdafx.h"

HHOOK hook;
HINSTANCE hInstance;

LRESULT CALLBACK HookProc(int code,WPARAM wParav,LPARAM lParam);


LRESULT CALLBACK HookProc(int code,WPARAM wParam,LPARAM lParam){
if (code<0)
    return CallNextHookEx(hook,code,wParam,lParam);

if(code==HCBT_ACTIVATE)
return 1;

return CallNextHookEx(hook,code,wParam,lParam);
}

далее в борланде:
Код

void __fastcall TForm1::Button1Click(TObject *Sender)
{
         hInst=LoadLibraryA("C:\Projects\HookDll\Debug\HookDll.dll") ;
                    hookProc=GetProcAddress(hInst,"Vse Ok");
     hook=SetWindowsHookEx(WH_CBT,(HOOKPROC)hookProc,hInst,0);
     }

void __fastcall TForm1::Button2Click(TObject *Sender)
{
      UnhookWindowsHookEx(hook);
}

Но как сказал-ничего не работает-в чем ошибка????
PM MAIL ICQ   Вверх
ama_kid
Дата 11.9.2008, 08:36 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


Профиль
Группа: Комодератор
Сообщений: 1460
Регистрация: 5.3.2007
Где: Москва

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



Цитата(fromrus @  11.9.2008,  00:11 Найти цитируемый пост)
в чем ошибка???? 
Наверное в том, что функции с именем "Vse Ok" нет в твоей dll



--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
fromrus
Дата 11.9.2008, 09:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



ах да,есть такое smile 
Но это ничего не изменило...скопировал полностью с мсдн:
Код

hInst=LoadLibrary("C:\HookDll.dll") ;
      hookProc=(HOOKPROC)GetProcAddress(hInst,"HookProc");
     hook=SetWindowsHookEx(WH_CBT,(HOOKPROC)hookProc,hInst,0);

не работает...может ошибка в библиотеке???Спасите плз!
PM MAIL ICQ   Вверх
ama_kid
Дата 11.9.2008, 11:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


Профиль
Группа: Комодератор
Сообщений: 1460
Регистрация: 5.3.2007
Где: Москва

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



Цитата(fromrus @  11.9.2008,  10:04 Найти цитируемый пост)
не работает
проверяй, что возвращают LoadLibrary и GetProcAddress. 
Цитата(fromrus @  11.9.2008,  10:04 Найти цитируемый пост)
может ошибка в библиотеке???
Проверяй, что функция HookProc действительно экспортируется из Dll (не вижу __declspec(dllexport)).





--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
fromrus
Дата 14.9.2008, 21:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



подправил,вот полноценный код:
длл сделана в ВС2008
Код

HHOOK hook;
HINSTANCE hInstance;


extern "C" __declspec(dllexport) LRESULT CALLBACK HookProc(int code,WPARAM wParav,LPARAM lParam);
  

extern "C" __declspec(dllexport) LRESULT CALLBACK HookProc(int code,WPARAM wParam,LPARAM lParam){
if (code<0)
    return CallNextHookEx(hook,code,wParam,lParam);

if(code==HCBT_ACTIVATE)
return 1;

CallNextHookEx(hook,code,wParam,lParam);
}

далее в борланде в обработчике кнопки пишу:
Код

static HINSTANCE hInst;
static HHOOK hook;
HOOKPROC hookProc;
.....
 void __fastcall TForm1::Button1Click(TObject *Sender)
{
         hInst=LoadLibraryA("HookDll.dll") ;
         if(hInst==NULL)
         {
        ShowMessage("Cannot load the library");
         }
      hookProc=(HOOKPROC)GetProcAddress(hInst,"HookProc");
      if(hookProc==NULL)
      {
      ShowMessage("Cannot load the function");
      }
      hook=SetWindowsHookEx(WH_CBT,(HOOKPROC)hookProc,hInst,0);
            Form1->Button1->Enabled=false;
     }

выяснилось что ХУКПРОК=нулу...почму не наю...и как писать:
extern "C" __declspec(dllexport) LRESULT CALLBACK HookProc(int code,WPARAM wParav,LPARAM lParam);
или
 __declspec(dllexport) LRESULT CALLBACK HookProc(int code,WPARAM wParav,LPARAM lParam);
??Билдится в обоих случаях удачно

PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.0468 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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