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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перехват WH_GETMESSAGE и WM_CHAR 
:(
    Опции темы
TechnoMag
Дата 21.9.2013, 20:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Маленькая поправочка: на XP работает, на Win7 - нет.
Похоже, что функция-фильтр не фиксирует WM_CHAR:

Код

    library CharHook;
     
    uses
      System.SysUtils,
      System.Classes,
      Windows, Messages;
     
    {$R *.res}
     
    const
      MMFName: PChar = 'MMFChar';
     
    type
      PGlobalDLLData = ^TGlobalDLLData;
      TGlobalDLLData=packed record
        SysHook:HWND; //дескриптор установленной ловушки
        MyAppWnd:HWND; //дескриптор нашего приложения
      end;
     
    var
      GlobalData:PGlobalDLLData;
      MMFHandle:THandle;
      WM_MYCHARHOOK:Cardinal;
     
    function GetMsgProc(Code: Integer; wParam: DWORD; lParam: DWORD): Longint; stdcall;
    begin
      if TMsg(Pointer(lParam)^).message=WM_CHAR then
         SendMessage(GlobalData.MyAppWnd, WM_MYCHARHOOK, 0, lParam);
      Result := CallNextHookEx(GlobalData.SysHook, Code, wParam, lParam);
    end;
     
     
    function mcharHook(switch: boolean; hMainProg: HWND): boolean; export; stdcall;
    begin
      if switch = True then
      begin
        GlobalData^.SysHook := SetWindowsHookEx(WH_GETMESSAGE, @GetMsgProc, hInstance, 0);
        GlobalData^.MyAppWnd := hMainProg;
        //if GlobalData^.HookWnd <> 0 then
        //  Result:= True;
      end
      else
      begin
        UnhookWindowsHookEx(GlobalData^.SysHook);
        //Result:= False;
      end;
      Result := true;
    end;
     
    procedure OpenGlobalData();
    begin
      {регестрируем свой тип сообщения в системе}
      WM_MYCHARHOOK := RegisterWindowMessage('WM_MYCHARHOOK');
      MMFHandle:= CreateFileMapping(INVALID_HANDLE_VALUE, nil, PAGE_READWRITE, 0, SizeOf(TGlobalDLLData), MMFName);
      GlobalData:= MapViewOfFile(MMFHandle, FILE_MAP_ALL_ACCESS, 0, 0, SizeOf(TGlobalDLLData));
      if GlobalData = nil then
        CloseHandle(MMFHandle);
    end;
     
    procedure CloseGlobalData();
    begin
      UnmapViewOfFile(GlobalData);
      CloseHandle(MMFHandle);
    end;
     
    procedure DLLEntryPoint(dwReason: DWord); stdcall;
    begin
      case dwReason of
        DLL_PROCESS_ATTACH: OpenGlobalData;
        DLL_PROCESS_DETACH: CloseGlobalData;
      end;
    end;
     
    exports mcharHook;
     
    begin
      //DLLProc:= @DLLEntryPoint;
      {вызываем назнаxенную процедуру для отражения факта присоединения данной
     библиотеки к процессу}
      DLLEntryPoint(DLL_PROCESS_ATTACH);
    end.
Код



    WM_MYCHARHOOK: Cardinal;
     
    function mcharHook(switch : Boolean; hMainProg: HWND):boolean; stdcall; external 'CharHook.dll';
     
    procedure TForm1.FormCreate(Sender: TObject);
    begin
      mcharHook(true, Form1.Handle);
    end;
     
    procedure TForm1.WndProc(var Msg: TMessage);
    begin
     inherited;
    if Msg.Msg = WM_MYCHARHOOK then
     begin
       Memo1.Lines.Add('--------  Нажата клавиша ------------');  // это сообщение не выводится
     end;
    end;
     
    initialization
      WM_MYCHARHOOK := RegisterWindowMessage('WM_MYCHARHOOK');
    end.


Это сообщение отредактировал(а) TechnoMag - 21.9.2013, 22:13
PM MAIL ICQ   Вверх
kami
Дата 22.9.2013, 20:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

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



Цитата(TechnoMag @  21.9.2013,  20:57 Найти цитируемый пост)
Похоже, что функция-фильтр не фиксирует WM_CHAR:

OpenGlobalData точно отрабатывает нормально?
Приложение, устанавливающее хук случайно запускается не с повышением прав ?
PM MAIL WWW   Вверх
TechnoMag
Дата 23.9.2013, 00:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



OpenGlobalData отрабатывает нормально. Запускаю без повышения прав.

Пересобрал c Target Platform - Win64 и с опцией milti-byte character support, но срабатывает только для 64-разрядных приложений.

Это сообщение отредактировал(а) TechnoMag - 23.9.2013, 01:55
PM MAIL ICQ   Вверх
kami
Дата 23.9.2013, 08:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

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



Цитата(TechnoMag @  23.9.2013,  00:28 Найти цитируемый пост)
Пересобрал c Target Platform - Win64 и с опцией milti-byte character support, но срабатывает только для 64-разрядных приложений.

ну дык... 
Цитата

A 32-bit DLL cannot be injected into a 64-bit process, and a 64-bit DLL cannot be injected into a 32-bit process.

Источник: MSDN

Кстати, размер HWND случайно не отличается на 32 и 64 - платформах? (это я про чтение и запись GlobalData. Хотя... оно ж всё в длл-ке, так что мешать не должно)

Это сообщение отредактировал(а) kami - 23.9.2013, 08:09
PM MAIL WWW   Вверх
TechnoMag
Дата 23.9.2013, 12:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Как же тогда перехватывать нажатия клавиш одновременно в 32-битных и 64-битных приложениях?
PM MAIL ICQ   Вверх
kami
Дата 23.9.2013, 19:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

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



Почитал немножко MSDN... пишут, что проблем нет с получением данных 32-битной длл из 64-битных процессов ( Community Additions про SetWindowsHookEx)
Однако, возвращаясь к первому вопросу - 
Цитата(kami @  22.9.2013,  20:54 Найти цитируемый пост)
OpenGlobalData точно отрабатывает нормально?

Не только при установке, но и в хуке?

Эх, проверить бы... да не на чем...

А вот если явно задействовать SecurityAttributes?
PM MAIL WWW   Вверх
TechnoMag
Дата 23.9.2013, 23:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



OpenGlobalData вроде нормально отрабатывает:

Код

procedure OpenGlobalData();
begin
  {регестрируем свой тип сообщения в системе}
  WM_MYCHARHOOK := RegisterWindowMessage('WM_MYCHARHOOK');
  MMFHandle := CreateFileMapping(INVALID_HANDLE_VALUE, nil, PAGE_READWRITE, 0, SizeOf(TGlobalDLLData), MMFName);
  if MMFHandle=0 then
    MessageBox(0, PWideChar('CharHook.dll'), PWIdeChar(SysErrorMessage(GetLastError)), MB_ICONINFORMATION or MB_OK);
  GlobalData := MapViewOfFile(MMFHandle, FILE_MAP_ALL_ACCESS, 0, 0, SizeOf(TGlobalDLLData));
  if GlobalData = nil then
  begin
    MessageBox(0, PWideChar('CharHook.dll'), PWideChar(SysErrorMessage(GetLastError)), MB_ICONINFORMATION or MB_OK);
    CloseHandle(MMFHandle);
  end;
end;


Ошибок не выдает. Вам исходники дать для проверки?
PM MAIL ICQ   Вверх
kami
Дата 24.9.2013, 08:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

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



Цитата(TechnoMag @  23.9.2013,  23:44 Найти цитируемый пост)
Вам исходники дать для проверки?

Мне - нет, я ж говорю - проверить не на чем. У меня исключительно 32-битные оси...
Но вот сюда выложить минимально рабочий набор наверное, стоит. Может, кто из Гуру чего подскажет.

Цитата(kami @  23.9.2013,  19:18 Найти цитируемый пост)
А вот если явно задействовать SecurityAttributes?

это не пробовали?
PM MAIL WWW   Вверх
TechnoMag
Дата 24.9.2013, 11:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Я не пойму, куда вы рекомендуете это подставить? В процедуре OpenGlobalData нет функции, которая бы принимала параметры связанные с Атрибутами безопасности.

Код

function InitMyDescriptor( SecDescriptor: PSECURITY_DESCRIPTOR): bool;
begin
  Result := False;
  if InitializeSecurityDescriptor(SecDescriptor, SECURITY_DESCRIPTOR_REVISION) then
    if SetSecurityDescriptorDACL(SecDescriptor, True, nil, True) then // устанавливаем полный доступ для всех.
      Result := True;
end;
var
  sa: TSecurityAttributes;
  sd: TSecurityDescriptor;
begin
  if not InitMyDescriptor(@sd) then
    exit;
  sa.lpSecurityDescriptor:=@sd;
  sa.nLength := SizeOf(TSecurityAttributes);
  sa.bInheritHandle := False;

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


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

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



Цитата(TechnoMag @  24.9.2013,  11:03 Найти цитируемый пост)
Я не пойму, куда вы рекомендуете это подставить?

Второй параметр CreateFileMapping
PM MAIL WWW   Вверх
TechnoMag
Дата 24.9.2013, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Никакого эффекта.
У меня такая же проблема и по этой теме: Перехват смены активного окна

Код

procedure OpenGlobalData();
var
  sa: TSecurityAttributes;
  sd: TSecurityDescriptor;
begin
   if not InitMyDescriptor(@sd) then
   begin
    MessageBox(0, PWideChar('ShellHook.dll'), PWIdeChar('Не возможно определить атрибуты безопасности'), MB_ICONINFORMATION or MB_OK);
    exit;
   end;
    sa.lpSecurityDescriptor:=@sd;
    sa.nLength := SizeOf(TSecurityAttributes);
    sa.bInheritHandle := False;
  {регестрируем свой тип сообщения в системе}
  WM_MYSHELLHOOK := RegisterWindowMessage('WM_MYSHELLHOOK');
  MMFHandle:= CreateFileMapping(INVALID_HANDLE_VALUE, @sa, PAGE_READWRITE, 0, SizeOf(TGlobalDLLData), MMFName);
  if MMFHandle=0 then
    MessageBox(0, PWIdeChar(SysErrorMessage(GetLastError)), PWideChar('ShellHook.dll'), MB_ICONINFORMATION or MB_OK);
  GlobalData:= MapViewOfFile(MMFHandle, FILE_MAP_ALL_ACCESS, 0, 0, SizeOf(TGlobalDLLData));
  if GlobalData = nil then
  begin
    MessageBox(0, PWIdeChar(SysErrorMessage(GetLastError)), PWideChar('ShellHook.dll'),MB_ICONINFORMATION or MB_OK);
    CloseHandle(MMFHandle);
  end;
end;

PM MAIL ICQ   Вверх
ZaDoXliK
Дата 30.9.2013, 03:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



У тебя задача просто отловить нажатые клавиши или ты хочешь замутить всё это что сверху своим кодом???

Этот ответ добавлен с нового Винграда - http://vingrad.com
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.

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


 




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


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

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