Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Ошибка в Hook ? [D7, WinXP]


Страницы:   1 2

Nikon ©   (2005-07-13 22:06:00) 

Здравствуйте, у меня следующий вопрос: в результате выполнения нижепредставленного кода при попытке нажать любую кнопку в любом приложении, за исключением приложения, которое этот хук собственно устанавливает, приложение закрывается, и появляется ошибка "Неправильный дескриптор окна". Подскажите пожалуйста где у меня ошибка и как её можно исправить?

unit Unit2;

interface
uses Windows, SysUtils;
const KF_UP_MY = $40000000;
var CurrentHook: HHook;
   hstr: string;
   CurFile:text;
   Layout: array[0.. KL_NAMELENGTH] of char;
function GlobalKeyBoardHook(code: integer; wParam: integer; lParam:
integer): longword; stdcall;
procedure SetupGlobalKeyBoardHook;
procedure unhook;
implementation
function GlobalKeyBoardHook(code: integer; wParam: integer; lParam:integer): longword; stdcall;
var
i:integer;
begin
 if code< 0 then
  begin
    result:=CallNextHookEx(CurrentHook,code,wParam,lparam);
    Exit;
  end;
 if ( (lParam and KF_UP_MY ) = 0) and (wParam>=65) and (wParam<=90) then
   begin
     hstr:=hstr+char(wparam);
     if length(hstr)=3 then
       begin
         if (uppercase(hstr)='WWW')and(GetKeyboardLayout(GetWindowThreadProcessId(GetForegroundWindow, nil))=68748313) then
           begin
             LoadKeyboardLayout(StrCopy(Layout,'00000409'),KLF_ACTIVATE);
               keybd_event(vk_Back, 0, 0, 0);
               keybd_event(vk_Back, 0, KEYEVENTF_KEYUP, 0);
               keybd_event(vk_Back, 0, 0, 0);
               keybd_event(vk_Back, 0, KEYEVENTF_KEYUP, 0);
               keybd_event(vk_Back, 0, 0, 0);
               keybd_event(vk_Back, 0, KEYEVENTF_KEYUP, 0);
           end;
           hstr:=copy(hstr,2,2);
       end;
      end;
   CallNextHookEx(CurrentHook,code,wParam,lparam);
   result:=0;
end;
procedure SetupGlobalKeyBoardHook;
begin
 hstr:='';
 CurrentHook:=SetWindowsHookEx(WH_KEYBOARD, @GlobalKeyBoardHook,HInstance, 0);
end;
procedure unhook;
begin
 UnhookWindowshookEx(CurrentHook);
end;
end.


Eraser   (2005-07-14 00:58:00) [21]

Во-первых переменная var CurrentHook: HHook; не допустима в данном случае, т.к. она будет разной для каждого приложения. Советую использовать трюк с "расшареной" памятью (MMF) в нете полно примеров.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо