DELPHI 屏蔽热键
//以下代码在Delphi7 + XP SP3下测试通过
//button1为注册钩子屏蔽,button2为卸载钩子取消屏蔽F1
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
WM_Sock :Integer;
hHandle :HWND;
Hook :HHook;
implementation
{$R *.dfm}
function LowLevelKeyboardProc(vNode:Integer;wParam:WPARAM;lParam:LPARAM):LRESULT;stdcall;
type
KbDllHookStruct = record
vkCode:DWord;
ScanCode:DWord;
Flags:DWord;
Time:DWord;
dwExtraInfo:DWord;
end;
var
P:^KbDllHookStruct;
begin
Result := 0;
P := Pointer(LPARAM);
if vNode = HC_ACTION then
begin
case wParam of
WM_KEYDOWN,WM_SYSKEYDOWN,WM_KEYUP,WM_SYSKEYUP:
if (p.vkCode = VK_F4(p.vkCode = VK) or (p.vkCode=VK_SHIFT) or (p.vkCode=VK_TAB) or (p.vkCode=VK_MENU) or (p.vkCode=VK_CONTROL ) or (p.vkCode=VK_ESCAPE ) or (p.vkCode=VK_LWIN) or (p.vkCode=VK_RWIN) or (p.vkCode=VK_RBUTTON) or (p.vkCode=VK_DELETE) then //判断按下键
begin
Result := 1;
end;
end;
if vNode <> 0 then
Result := CallNextHookEx(0,vNode,wParam,lParam);
end;
end;
//注册钩子
procedure TForm1.Button1Click(Sender: TObject);
const
WH_KEYBOARD_LL = 13;
begin
WM_SOCK := 0;
WM_SOCK := RegisterWindowMessage('WM_SOCK');
hHandle := Handle;
Hook := SetWindowsHookEx(WH_KEYBOARD_LL,LowLevelKeyboardProc,hInstance,0);
end;
//卸载钩子
procedure TForm1.Button2Click(Sender: TObject);
begin
UnHookWindowsHookEx(Hook);
end;
end.
转自:http://hi.baidu.com/ipconfig/item/830e09a7aef0b03c030a4d72
亲测,这代码是可以运行成功的。如果修改一下这个部分 (p.vkCode = VK_F4(p.vkCode 应该就可以屏蔽指定按键了。