HanDs
管理员

[Delphi文章] 屏蔽ALT+TAB键 



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;
{按键消息的结构,Delphi中也没有,自己定义吧。这也就是我为什么说用C写
这样的程序更好的原因之一。还必须注意的是这个结构在Windows NT 4 sp3以上系统中才能使用}
tagKBDLLHOOKSTRUCT = packed record
  vkCode: DWORD;//虚拟键值
  scanCode: DWORD;//扫描码值(没有用过,我也不懂^_^)
  {一些扩展标志,这个值比较麻烦,MSDN上说得也不太明白,但是
  根据这个程序,这个标志值的第六位数(二进制)为1时,Alt键按下为0}
  flags: DWORD;
  time: DWORD;//消息时间戳
  dwExtraInfo: DWORD;//和消息相关的扩展信息
end;
  KBDLLHOOKSTRUCT = tagKBDLLHOOKSTRUCT;
  PKBDLLHOOKSTRUCT = ^KBDLLHOOKSTRUCT;
//这个是低级键盘钩子的索引值,Delphi中没有,必须自己定义
const WH_KEYBOARD_LL = 13;
//定义一个常量好和上面那个结构中的flags比较而得出Alt键是否按下
const LLKHF_ALTDOWN = $20;
var
  Form1: TForm1;
  hhkLowLevelKybd: HHOOK;
implementation
{
功能:低级键盘钩子的回调函数,在里面过滤消息
参数: nCode   是Hook的标志
     WParam  表示消息的类型
     LParam  是一个指向我们在上面定义的那个结构KBDLLHOOKSTRUCT的指针
返回值:如果不是0的话,Windows就把这个消息丢掉,程序就不会再收到这个消息了。
}
function LowLevelKeyboardProc(nCode: Integer;
  WParam: WPARAM;LParam: LPARAM):LRESULT; stdcall;
var
  fEatKeystroke: BOOL;
  p: PKBDLLHOOKSTRUCT;
begin
  Result := 0;
  fEatKeystroke := FALSE;
  p := PKBDLLHOOKSTRUCT (lParam);
  //nCode值为HC_ACTION时表示WParam和LParam参数包含了按键消息
  if (nCode = HC_ACTION) then
  begin
  //拦截按键消息并测试是否是Ctrl+Esc、Alt+Tab和Alt+Esc功能键
    case wParam of
      WM_KEYDOWN,
      WM_SYSKEYDOWN,
      WM_KEYUP,
      WM_SYSKEYUP:
        fEatKeystroke :=
          ((p.vkCode = VK_TAB) and ((p.flags and LLKHF_ALTDOWN) <> 0)) or
          ((p.vkCode = VK_ESCAPE) and ((p.flags and LLKHF_ALTDOWN) <> 0)) or
          ((p.vkCode = VK_ESCAPE) and ((GetKeyState(VK_CONTROL) and $8000) <> 0));
    end;
  end;
  if fEatKeystroke = True then
    Result := 1;
  if nCode <> 0 then
     Result := CallNextHookEx(0, nCode, wParam, lParam);
end;
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
  //设置低级键盘钩子
  hhkLowLevelKybd := SetWindowsHookExW(WH_KEYBOARD_LL,
    LowLevelKeyboardProc, Hinstance, 0);
  if hhkLowLevelKybd <> 0 then
    MessageBox(0, '低级键盘钩子设置成功!', '提示', MB_OK);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
  //卸载低级键盘钩子
  if hhkLowLevelKybd <> 0 then
  begin
    UnhookWindowsHookEx(hhkLowLevelKybd);
    MessageBox(0, '低级键盘钩子卸载成功!', '提示', MB_OK);
  end;
end;
end.   


学习中请遵守法律法规,本网站内容均来自于互联网,本网站不负担法律责任
屏蔽
#1楼
发帖时间:2016-7-9   |   查看数:0   |   回复数:0
游客组
快速回复