zoukankan      html  css  js  c++  java
  • [代码]Delphi实现双击左CTRL键调用记事本

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

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

    Hook

    调用就是 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.

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

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

    Technorati 标签: Delphi,Hook,CTRL
  • 相关阅读:
    基于Metaweblog API 接口一键发布到国内外主流博客平台
    uva144 Student Grants
    Uva 10452
    Uva 439 Knight Moves
    Uva 352 The Seasonal War
    switch语句
    java——基础知识
    我的lua学习2
    codeforces 431 D. Random Task 组合数学
    codeforces 285 D. Permutation Sum 状压 dfs打表
  • 原文地址:https://www.cnblogs.com/journeyonmyway/p/2104360.html
Copyright © 2011-2022 走看看