Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 02.04.2007, 20:43   #1
Сильванович Михаил
Студент
Форумчанин
 
Регистрация: 10.11.2006
Сообщений: 196
По умолчанию Hook off?

Доброго времени суток!
Итак, проблема состоит в том, что, когда я устанавливаю глоюальный
хук (WH_JOURNALRECORD) на отслеживание нажатия клавишь, все происходит
нормально (на определнную клавише ставится действие - оно выполняется), но
стоит мне запустить TaskMon (Ctrl+Alt+Del) мой хук как бы вырубается - программа никак не реагирует на нажатия.

wplmn.dpr:

Код:
program wplmn;
{
F12:
 1 - Play/Pause
 2 - Stop
 3 - Next Track
 4 - Previous Track
}
uses Windows,Messages,WinCls{,ShellApi};
var
  HookHandle: hHook;
  CmdTimer: Cardinal;
  uCmd: byte;
  winamp_state: boolean;
  hApp: THandle;
  wClass: TWndClass;
  wMSG: TMSG;
const
 cmd_interval = 1000;
 WINAMP_BUTTON1 = 40044; //Previous
 WINAMP_BUTTON2 = 40045; //Play
 WINAMP_BUTTON3 = 40046; //Pause
 WINAMP_BUTTON4 = 40047; //Stop
 WINAMP_BUTTON5 = 40048; //Next
 
function GetWinAmpHandle: HWND;
begin
 Result := FindWindow('Winamp v1.x', nil);
end;
 
procedure WinAmp_Command(CommandConst: Word);
begin
 SendMessage(GetWinAmpHandle, WM_COMMAND, CommandConst, 0);
end;
 
procedure PlayPouse;
begin
 
 if WinAmp_state then WinAmp_Command(WINAMP_BUTTON3)
 else WinAmp_Command(WINAMP_BUTTON2);
 WinAmp_state:=not WinAmp_state;
end;
 
procedure Stop;
begin
 WinAmp_state:=false;
 WinAmp_Command(WINAMP_BUTTON4);
end;
 
procedure NextTrack;
begin
 WinAmp_Command(WINAMP_BUTTON5);
 WinAmp_Command(WINAMP_BUTTON2);
end;
 
procedure PrevTrack;
begin
 WinAmp_Command(WINAMP_BUTTON1);
 WinAmp_Command(WINAMP_BUTTON2);
end;
 
procedure CmdProc;
begin
 case uCmd of
  1: PlayPouse;
  2: Stop;
  3: NextTrack;
  4: PrevTrack;
 end;
 if uCmd<>0 then uCmd:=0;
 KillTimer(hApp,CmdTimer);
end;
 
function IntToStr(Int: integer): string;
begin
 Str(Int, result);
end;
 
function HookProc(Code: integer; WParam: word; LParam: Longint): Longint; stdcall;
var
  msg: PEVENTMSG;
begin
 if Code>=0 then
 begin
  result:=0;
  msg:=Pointer(LParam);
  if msg.message=WM_KEYDOWN then
  begin
   if MapVirtualKey(VK_F12,0)=msg.paramH then
   begin
    if uCmd=0 then
    begin
     SetTimer(hApp,CmdTimer,cmd_interval,@CmdProc);
     uCmd:=1;
    end else Inc(uCmd);
   end;
  end;
 end else result:=CallNextHookEx(HookHandle,Code,wParam,lParam);
end;
 
procedure UnhookMyHook;
begin
  if HookHandle <> 0 then
    UnhookWindowsHookEx(HookHandle);
end;
 
procedure SetMyHook;
begin
 repeat
  HookHandle := SetWindowsHookEx(WH_JOURNALRECORD, @HookProc, hInstance, 0);
 until HookHandle<>0;
end;
 
function WndMessageProc(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): UINT; stdcall;
begin
 Result := 0;
  case Msg of
   WM_CREATE:
   begin
    winamp_state:=false;
    uCmd:=0;
    SetMyHook;
   end;
   WM_DESTROY,WM_CLOSE:
   begin
    UnhookMyHook;
    PostQuitMessage(0);
   end;
 end;
 Result := DefWindowProc(hWnd,Msg,wParam,lParam);
end;
 
begin
  wClass:=WndClass1(hInstance,0,0,0,0,0,COLOR_BTNFACE,'MYCLASS','',@WndMessageProc);
  RegisterClass(wClass);
  hApp:=CreateWindow(wClass.lpszClassName, '',0,
  Integer(CW_USEDEFAULT), Integer(CW_USEDEFAULT),
  0, 0, 0, 0, hInstance, nil);
  if hApp=0 then
  begin
   UnregisterClass('MYCLASS',hInstance);
   halt(0);
  end;
  winamp_state:=false;
  loopWindow(wMsg);
end.
wincls.pas:

Код:
unit WinCls;
 
interface
 
uses Windows,Messages;
 
function CreateWnd(wClass: TWndClass; hInstance: HWND; Caption: string; w,h: integer): HWND;
 
function WndClass1(hInstance: HWND; style,ClsExtra,WndExtra:integer; ICON: hIcon; CURSOR: hCursor; Background: HBrush; ClassName,MenuName: string; Proc: Pointer): TWndClass;
 
procedure loopWindow(Msg: TMsg);
 
implementation
 
function WndClass1(hInstance: HWND; style,ClsExtra,WndExtra:integer; ICON: hIcon; CURSOR: hCursor; Background: HBrush; ClassName,MenuName: string; Proc: Pointer): TWndClass;
var wCls: TWNDClass;
begin
  wCls.hInstance:=hInstance;
  wCls.style:= style;
  with wCls do begin
   hIcon         := ICON;
   lpfnWndProc   := Proc;
   hbrBackground := Background;
   lpszClassName := PChar(ClassName);
   hCursor       := CURSOR;
   cbClsExtra    := ClsExtra;
   cbWndExtra    := WndExtra;
   lpszMenuName  := PChar(MenuName);
  end;
  Result:=wCls;
end;
 
function CreateWnd(wClass: TWndClass; hInstance: HWND; Caption: string; w,h: integer): HWND;
begin
  Result:=CreateWindow(wClass.lpszClassName, PChar(Caption),
  WS_OVERLAPPEDWINDOW or WS_VISIBLE, Integer(CW_USEDEFAULT), Integer(CW_USEDEFAULT),
  w, h, 0, 0, hInstance, nil);
end;
 
procedure loopWindow(Msg: TMsg);
begin
  while GetMessage(Msg,0,0,0) do begin
    TranslateMessage(Msg);
    DispatchMessage(Msg);
  end;
end;
end.
В чем проблема?
Спасибо.
Visita Interiorem Terrae Rectificando Operae Lapidem...
Сильванович Михаил вне форума
Старый 03.04.2007, 16:25   #2
Сильванович Михаил
Студент
Форумчанин
 
Регистрация: 10.11.2006
Сообщений: 196
По умолчанию

Спасибо всем, кто мне попытался ответить... :D
З.Ы. Сам разобрался.

Код:
program wplmn;
{
F12:
 1 - Play/Pause
 2 - Stop
 3 - Next Track
 4 - Previous Track
}
uses Windows,Messages,WinCls{,ShellApi};
var
  HookHandle: hHook;
  HookResetTimer,CmdTimer: Cardinal;
  uCmd: byte;
  hApp: THandle;
  wClass: TWndClass;
  wMSG: TMSG;
const
 hook_reset_interval = 3000;
 cmd_interval = 1000;
 IPC_ISPLAYING  = 104;
 WINAMP_BUTTON1 = 40044; //Previous
 WINAMP_BUTTON2 = 40045; //Play
 WINAMP_BUTTON3 = 40046; //Pause
 WINAMP_BUTTON4 = 40047; //Stop
 WINAMP_BUTTON5 = 40048; //Next
function GetWinAmpHandle: HWND;
begin
 Result := FindWindow('Winamp v1.x', nil);
end;
function WinAmp_IsPlaying: Boolean;
var
 hWinAmp: hWnd;
 val : integer;
begin
 val := 0;
 hWinAmp:=GetWinampHandle;
 if hWinAmp<>0 then
  Result:=(1 = Sendmessage(hWinAmp, WM_USER, val, IPC_ISPLAYING))
 else Result:=false;
end;
procedure WinAmp_Command(CommandConst: Word);
begin
 SendMessage(GetWinAmpHandle, WM_COMMAND, CommandConst, 0);
end;
procedure PlayPouse;
var WinAmp_state: boolean;
begin
 WinAmp_state:=WinAmp_IsPlaying;
 if WinAmp_state then WinAmp_Command(WINAMP_BUTTON3)
 else WinAmp_Command(WINAMP_BUTTON2);
end;
procedure Stop;
begin
 WinAmp_Command(WINAMP_BUTTON4);
end;
procedure NextTrack;
begin
 WinAmp_Command(WINAMP_BUTTON5);
 WinAmp_Command(WINAMP_BUTTON2);
end;
procedure PrevTrack;
begin
 WinAmp_Command(WINAMP_BUTTON1);
 WinAmp_Command(WINAMP_BUTTON2);
end;
procedure CmdProc;
begin
 case uCmd of
  1: PlayPouse;
  2: Stop;
  3: NextTrack;
  4: PrevTrack;
 end;
 if uCmd<>0 then uCmd:=0;
 KillTimer(hApp,CmdTimer);
end;
{function IntToStr(Int: integer): string;
begin
 Str(Int, result);
end;}
function HookProc(Code: integer; WParam: word; LParam: Longint): Longint; stdcall;
var
  msg: PEVENTMSG;
begin
 if Code>=0 then
 begin
  result:=0;
  msg:=Pointer(LParam);
  if msg.message=WM_KEYDOWN then
  begin
   if MapVirtualKey(VK_F12,0)=msg.paramH then
   begin
    if uCmd=0 then
    begin
     SetTimer(hApp,CmdTimer,cmd_interval,@CmdProc);
     uCmd:=1;
    end else Inc(uCmd);
   end;
  end;
 end else result:=CallNextHookEx(HookHandle,Code,wParam,lParam);
end;
procedure UnhookMyHook;
begin
  if HookHandle <> 0 then
    UnhookWindowsHookEx(HookHandle);
end;
procedure SetMyHook;
begin
 repeat
  HookHandle := SetWindowsHookEx(WH_JOURNALRECORD, @HookProc, hInstance, 0);
 until HookHandle<>0;
end;
procedure ResetHook;
var hh0: HHOOK;
begin
 hh0:=HookHandle;
 UnhookMyHook;
 repeat
  HookHandle := SetWindowsHookEx(WH_JOURNALRECORD, @HookProc, hInstance, 0);
 until (HookHandle<>hh0)and(HookHandle<>0);
end;
 
function WndMessageProc(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): UINT; stdcall;
begin
 Result := 0;
  case Msg of
   WM_CREATE:
   begin
    uCmd:=0;
    SetMyHook;
    SetTimer(0,HookResetTimer,hook_reset_interval,@ResetHook);
   end;
   WM_DESTROY,WM_CLOSE:
   begin
    UnhookMyHook;
    KillTimer(0,HookResetTimer);
    PostQuitMessage(0);
   end;
 end;
 Result := DefWindowProc(hWnd,Msg,wParam,lParam);
end;
begin
  wClass:=WndClass1(hInstance,0,0,0,0,0,COLOR_BTNFACE,'MYCLASS','',@WndMessageProc);
  RegisterClass(wClass);
  hApp:=CreateWindow(wClass.lpszClassName, '',0,
  Integer(CW_USEDEFAULT), Integer(CW_USEDEFAULT),
  0, 0, 0, 0, hInstance, nil);
  if hApp=0 then
  begin
   UnregisterClass('MYCLASS',hInstance);
   halt(0);
  end;
  loopWindow(wMsg);
end.
Visita Interiorem Terrae Rectificando Operae Lapidem...
Сильванович Михаил вне форума
Закрытая тема


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Hook на копирование. Dj_smart Win Api 4 26.05.2008 00:22
Хук (hook) на клавиатуру eoln Win Api 17 03.05.2008 18:35
Что такое Hook? AngelOfDeath Общие вопросы Delphi 1 07.04.2008 15:14
hook в dll? Altera Win Api 3 09.03.2008 09:54
Hook... Roof Общие вопросы Delphi 5 06.11.2007 16:25