опубликован 06-04-2001 16:39 MSK
чтобы отслеживать нажатие клавиш во всех приложения, нужно сделать DLL с функцией Hook'a и вызывать эту функцию из проги.
Даже пример не жалко - по F12 выключает компьютер. У меня работает. (C) не мой - собрано из 2 примеров, не помню откуда.=================================
program testwindow;
uses
Windows,
Messages;
var
WinClass: TWndClassA;
Inst, hMainWindow: Integer;
Msg: TMsg;
P:Pointer;
DLL:HMODULE;
function key_hook(Code: integer; wParam: word; lParam: Longint): Longint; external 'Lib1.dll';
{ Custom WindowProc function }
function WindowProc(hWnd, uMsg, wParam, lParam: Integer): Integer; stdcall;
begin
Result := DefWindowProc(hWnd, uMsg, wParam, lParam);
{ Checks for messages }
if uMsg = WM_DESTROY then Halt;
end;
begin
Inst := hInstance;
with WinClass do
begin
style := CS_CLASSDC or CS_PARENTDC;
lpfnWndProc := @WindowProc;
hInstance := Inst;
hbrBackground := color_btnface + 1;
lpszClassname := 'NewClass';
hCursor := LoadCursor(0, IDC_CROSS);
end; { with }
if (RegisterClass(WinClass)<>0)then
begin
hMainWindow := CreateWindowEx(WS_EX_WINDOWEDGE, 'NewClass', '',
WS_SIZEBOX or WS_CAPTION or WS_SYSMENU,
363, 278, 305, 130, 0, 0, Inst, nil);
ShowWindow(hMainWindow,SW_HIDE);
UpdateWindow(hMainWindow);
DLL:=LoadLibrary('ShutDown');
p:=@key_hook;
while(GetMessage(Msg, hMainWindow, 0, 0)) do
begin
TranslateMessage(msg);
DispatchMessage(msg);
end;
FreeLibrary(DLL);
end;
end.
library ShutDown;
uses
WinTypes, WinProcs, Messages;
var
SaveExitProc : Pointer;
HookHandle: hHook = 0;
function key_hook(Code: integer; wParam: word; lParam: Longint): Longint; stdcall;
begin
if Code >= 0 then
begin
if(wParam = VK_F12)then ExitWindowsEx(EWX_SHUTDOWN,0);
Result:=0;
end
else
Result := CallNextHookEx(HookHandle,Code, wParam, lParam);
end;
procedure LocalExitProc; far;
begin
if HookHandle<>0 then
begin
UnhookWindowsHookEx(HookHandle);
ExitProc := SaveExitProc;
end;
end;
exports Key_hook;
begin
HookHandle := SetWindowsHookEx(wh_Keyboard, @Key_Hook, hInstance, 0);
if HookHandle <> 0 then
begin
SaveExitProc := ExitProc;
ExitProc := @LocalExitProc;
end;
end.