• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

[代码]Delphi实现双击左CTRL键调用记事本

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

要实现对双击左CTRL键的监控,必须玩钩子了。

代码很简单,新建VCL Form的工程,在窗体上放两个按钮,分别叫做 btnHook 和 btnUnHook。

调用就是 BeginHook 和 EndHook 这两个函数,窗体代码如下:

unit frmTestHookWinKey;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ShellAPI;

type
  TForm1 = class(TForm)
    btnHook: TButton;
    btnUnHook: TButton;
    procedure btnHookClick(Sender: TObject);
    procedure btnUnHookClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

var
  KeyHook: HHook;
  HitTime: Cardinal;                                    // 击键的间隔时间
  HitThreshold: Integer;                                // 击键的间隔时间门限

function HookKey(Code: integer; wParam: wParam; lParam: lParam): LRESULT; stdcall;
type
  PKBDLLHOOKSTRUCT = ^KBDLLHOOKSTRUCT;
  KBDLLHOOKSTRUCT = record
    vkCode: DWORD;
    ScanCode: DWORD;
    Flags: DWORD;
    Time: DWORD;
    dwExtraInfo: DWORD;
  end;
begin
  // 如果左 CTRL 键按下
  if (Code = HC_ACTION) and (PKBDLLHOOKSTRUCT(lParam).vkCode = VK_LCONTROL) and (wParam = WM_KEYDOWN) then begin
    if HitTime > 0 then begin
      HitTime := GetTickCount - HitTime;                // 取得间隔时间
      if HitTime <= HitThreshold then begin      // 如果间隔时间在门限时间之内,则调用记事本
        WinExec('notepad.exe', SW_SHOWNORMAL);
        HitTime := 0;
      end
      else
        HitTime := GetTickCount;
    end
    else
      HitTime := GetTickCount;
  end;

  Result := CallNextHookEx(KeyHook, Code, wParam, lParam);
end;

procedure BeginHook;
begin
  KeyHook := SetWindowsHookEx(13 {=WH_KEYBOARD_LL}, @HookKey, HInstance, 0);
end;

procedure EndHook;
begin
  UnhookWindowsHookEx(KeyHook);
end;

procedure TForm1.btnHookClick(Sender: TObject);
begin
  BeginHook;
end;

procedure TForm1.btnUnHookClick(Sender: TObject);
begin
  EndHook;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  HitTime := 0;
  HitThreshold := 200;                                  // 200 ms
end;

end.

既然调用记事本都搞定了,干些其他的事儿自然不在话下了。

这段代码完全可以封装为一个模块,将监控的按键、间隔时间及回调函数当作参数传入即可。

CTRL

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Delphi正则表达式起步发布时间:2022-07-18
下一篇:
WebBrowser、MSHTML在Delphi中的使用[转]发布时间:2022-07-18
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap