Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Глобальный хук... как реализовать 
V
    Опции темы
dumb
Дата 20.2.2007, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


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

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



Цитата(tigger @  20.2.2007,  12:55 Найти цитируемый пост)
dumb, по подробнее можно. 

схема достаточно подробна. рассказывай, что в ней тебе непонятно.

ps. эта фраза
Цитата(MetalFan @  19.2.2007,  17:17 Найти цитируемый пост)
да уж, код не блещет наглядностью

относилась к твоему коду, а не к моей схеме... smile
PM MAIL   Вверх
tigger
Дата 20.2.2007, 17:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 456
Регистрация: 30.4.2005

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



Так то все стало понятно отлов появления на панели задач сделал, а как теперь в тестовом приложении словить появление окна формы.
Код прилагаю.

Да еще без ide среды запускаешь проект ошибка обращения к памяти dll вылетает.

Это сообщение отредактировал(а) tigger - 20.2.2007, 17:52

Присоединённый файл ( Кол-во скачиваний: 15 )
Присоединённый файл  hook3.rar 35,59 Kb


--------------------
user posted image
PM MAIL   Вверх
dumb
Дата 20.2.2007, 18:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


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

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



tigger, основное твое непонимание:
CreateFileMapping создает область памяти. MapViewOfFile - отображает эту область в адресное пространство твоего процесса.
т.е. ты не должен выделять память для ArrHide, и работать с этим массивом нужно после CreateFileMapping/MapViewOfFile. причем в схеме, которую я приводил, это вроде как достаточно очевидно.

вобщем, в dll у тебя правильно сделано, если убрать GetMem. относительно массива pid'ов: делай его размер на один элемент больше и последний эл-т делай = 0. в dll отловишь конец массива именно по этому нулевому эл-ту.

StopHookProc вызываешь неинициализированный - это остался "хвост" от прошлой версии dll. сделай обычную процедуру с таким же именем:
Код

procedure StopHookProc;
begin
  UnhookWindowsHookEx(hook);
  UnmapViewOfFile(ArrHide);
  CloseHandle(hMemFile);
end;

PM MAIL   Вверх
MetalFan
Дата 20.2.2007, 22:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

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



+ ПОКА не будет сделано UnmapViewOfFile, данные, что ты поместил в отораженную область памяти у себя в процессе, будут недоступны другим процессам(читай-хукам в других процессах), AFAIK.
p.s. хотя кажется я гоню) но главное не забыть про синхронизацию

Это сообщение отредактировал(а) MetalFan - 20.2.2007, 22:16


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
tigger
Дата 21.2.2007, 02:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 456
Регистрация: 30.4.2005

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



Я не понял почему этот код не отлавливает появление главного окна в моем тестовом приложении. 


--------------------
user posted image
PM MAIL   Вверх
dumb
Дата 21.2.2007, 06:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


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

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



Цитата(tigger @  21.2.2007,  02:05 Найти цитируемый пост)
Я не понял почему этот код не отлавливает появление главного окна в моем тестовом приложении.

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

ты определись, что ты хочешь: сам что-то понять и сделать или чтобы за тебя все сделали, а ты бы только вставил "if count > 2 then ShowMessage('это demo-версия')"? - если последнее, то я - пас.
PM MAIL   Вверх
tigger
Дата 21.2.2007, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 456
Регистрация: 30.4.2005

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



Спасибо за ответ.

Это сообщение отредактировал(а) tigger - 22.2.2007, 12:32


--------------------
user posted image
PM MAIL   Вверх
MetalFan
Дата 21.2.2007, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

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



причеши код, а?
честно говоря, с кодом, написаным ТАКИМ стилем ковыряться нет никакого удовольствия и/или желания(
если приведешь в читаемый вид, то посмотрю ;)

Код

function cbt_hook(c0de:integer; wParam: word; lParam : longint): LResult; stdcall;
var
pProcID :THandle;
i:integer;
begin
ishide:=false;
if c0de >= 0 then
begin  //1
              //отлов вновь показываемых окон
    if c0de = HCBT_ACTIVATE then
           //берем дескриптор владельца и его имя
    begin

                   if ishide = true then
                       begin
                          Result:= 1;
                          ishide:=false;
                          ShowWindow(wParam,SW_HIDE);
                          CallNextHookEx(0, c0de, wParam, lParam);
                          Exit;
                       end else
                           begin
                           result := CallNextHookEx(0, c0de, wParam, lParam);
                           exit;
                           end;                         //end;
                
      end;
end else  //__1
begin
//Вызываем следующую ловушку в цепочке ловушек Windows
result := CallNextHookEx(0, c0de, wParam, lParam);
exit;
end;

трудно чтоли отформатировать так: ??
Код

//функция ловушка показа окон
function cbt_hook(c0de:integer; wParam: word; lParam : longint): LResult; stdcall;
var
  pProcID :THandle;
  i:integer;
begin
  ishide:=false;
  if c0de >= 0 then
  begin  //1
    //отлов вновь показываемых окон
    if c0de = HCBT_ACTIVATE then
    //берем дескриптор владельца и его имя
    begin
      if ishide = true then
      begin
        Result:= 1;
        ishide:=false;
        ShowWindow(wParam,SW_HIDE);
        CallNextHookEx(0, c0de, wParam, lParam);
        Exit;
      end
      else
      begin
        result := CallNextHookEx(0, c0de, wParam, lParam);
        exit;
      end;                         //end;
    end;
  end
  else  //__1
  begin
    //Вызываем следующую ловушку в цепочке ловушек Windows
    result := CallNextHookEx(0, c0de, wParam, lParam);
    exit;
  end;
  {Вызываем следующую ловушку в цепочке ловушек Windows}
  Result := CallNextHookEx(0, c0de, wParam, lParam);
End;

хотя зачем столько exit'ов и проверок?

Код

    Dll_Process_Attach :
     begin

     GetMem(ArrHide,2*sizeof(THandle)); //ЗАЧЕМ это здесь?
     hMemFile  := OpenFileMapping(FILE_MAP_WRITE, False, 'Global');
     ArrHide := MapViewOfFile(hMemFile, FILE_MAP_WRITE, 0, 0, 0);
     pid := GetCurrentProcessId;
     {R-}

     for i := 0 to 2 do
     begin
     if ArrHide[i] = pid then begin ishide := true; break; end;
     end;

     UnmapViewOfFile(ArrHide);
     CloseHandle(hMemFile); //если MMF больше нигде не открыт, то он прекратит свое сущесвтование...
     
    end;


з.ы. добавлю - ошибок просто масса... причем порой из-за ужасного кода


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
tigger
Дата 21.2.2007, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 456
Регистрация: 30.4.2005

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



MetalFan посмотри причесал вроде бы. Какие там ошибки там кода то мало я ничего не вижу?

Присоединённый файл ( Кол-во скачиваний: 13 )
Присоединённый файл  hook3.rar 35,26 Kb


--------------------
user posted image
PM MAIL   Вверх
MetalFan
Дата 21.2.2007, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

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



tigger, ММ.. что причесал? не вижу никакого причесывания.

ладно, в кратце по ошибкам.
в dll:
1) где выделяется/освобождается память под PHookRec?
2) почитай( в мсдн например) как правильно работать с хуком WH_CBT. у тебя бред написан, imho
3) в DllEntryPoint что-то тоже както неочень хорошо написано.

проведи рефаторинг кода или забрось программирование...
код написан просто УЖАСНО. 
1) код отформатирован абсолюьно нечитаемо и не наглядно
2) названия локальных/глобальных переменных/полей классов ничем не отличаются
3) весь код в классах форм "свален" в обработчики событий...
4) и т.д. и т.п.

з.ы. былоб время, причесал бы немного твой код. но время=деньги... 
если хошь, могу баксов за 10-20 довести до рабочего состояния твой проектик ;)

Это сообщение отредактировал(а) MetalFan - 21.2.2007, 18:34


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
tigger
Дата 22.2.2007, 01:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Awaiting Authorisation
Сообщений: 456
Регистрация: 30.4.2005

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



MetalFan, сомневаюсь что от форматирования кода зависит его работа, то что код в обработчиках это не смертельно.
PHookRec я уже не использую после подсказок "мозголома".
И все таки ошибка в чем то глобальном.
Всем спасибо, побольше бы таких учителей.


--------------------
user posted image
PM MAIL   Вверх
MetalFan
Дата 22.2.2007, 09:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

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



Цитата(tigger @  22.2.2007,  01:56 Найти цитируемый пост)
сомневаюсь что от форматирования кода зависит его работа

зависит. еще как. 
ошибки гораздо проще находить. это как минимум.
Цитата(tigger @  22.2.2007,  01:56 Найти цитируемый пост)
ошибка в чем то глобальном

вот именно. на некоторые места, что содержат ошибки, я тебе уже указал. 
в таким образом оформленном коде их править мягкоговоря не удобно.
а рефакторингом за тебя заниматься никто не будет)
повторюсь:
Цитата(MetalFan @  21.2.2007,  17:04 Найти цитируемый пост)
1) код отформатирован абсолюьно нечитаемо и ненаглядно
2) названия локальных/глобальных переменных/полей классов ничем не отличаются
3) весь код в классах форм "свален" в обработчики событий...

к этому еще добавлю абсолютно не оправданное использование глобальных переменных.



--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

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


 




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


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

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