截留系统消息
参考《Delphi 5 开发人员指南》

解决方案 »

  1.   

    谢谢,我用HOOK搞定了,有一个例子可供大家参考
    先是DLL
    library HKTest;{ 按下Ctro+B,启动记事本 }uses
      SysUtils,
      Classes,
      HKProc in 'HKProc.pas';exports
      EnableHotKeyHook,
      DisableHotKeyHook;
    begin
      hNextHookProc:=0;
      procSaveExit:= ExitProc;
      ExitProc:= @HotKeyHookExit;
    end.unit HKProc;interfaceuses
      Windows, Messages, Dialogs,Shellapi;Var
      hNextHookProc: HHook;
      procSaveExit: Pointer;function KeyboardHookHandler(iCode: Integer;wParam: WPARAM;
                                 lParam: LPARAM): LResult; stdcall; export;
    function EnableHotKeyHook: Bool; export;
    function DisableHotKeyHook: Bool; export;
    procedure HotKeyHookExit; far;implementationfunction KeyboardHookHandler(iCode: Integer;wParam: WPARAM;
                                 lParam: LPARAM): LResult; stdcall; export;
    const
      _KeyPressMask = $80000000;
    begin
      Result:=0;
      if iCode<0 then
      begin
        Result:= CallNextHookEx(hNextHookProc, iCode, wParam, lParam);
        exit;
      end;
      //侦测Ctrl+B组合键
      if ((lParam and _KeyPressMask)=0)and
        (GetKeyState(vk_control)<0)and(wParam=Ord('B')) then
      begin
        Result:=1;
        //ShellExecute(hInstance,'open','Notepad.exe','','',sw_Normal);
        WinExec('Notepad.exe',sw_Normal);
      end;
    end;function EnableHotKeyHook: Bool; export;
    begin
      Result:= False;
      if hNextHookProc<>0 then exit;
      //挂上WH_KEYBOARD 的HOOK, 同时,传回值必须保留下来,免的HOOK调用链断掉
      hNextHookProc:= SetWindowsHookEx(WH_KEYBOARD,KeyboardHookHandler,HInstance,0);
      Result:= hNextHookProc<>0;
    end;function DisableHotKeyHook: Bool; export;
    begin
      if hNextHookProc<>0 then
      begin
        UnHookWindowsHookEx(hNextHookProc);
        hNextHookProc:=0 ;
        MessageBeep(0);
        MessageBeep(0);
      end;
      Result:= hNextHookProc =0;
    end;procedure HotKeyHookExit;
    begin
      //如果忘了解除HOOK,自动代理解除的动作
      if hNextHookProc<>0 then DisableHotKeyHook;
      ExitProc:= procSaveExit;
    end;
    end.下面是测试程序
    program hk;uses
      Forms,
      Unit1 in 'Unit1.pas' {Form1};{$R *.RES}begin
      Application.Initialize;
      Application.CreateForm(TForm1, Form1);
      Application.Run;
    end.unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls;type
      TForm1 = class(TForm)
        procedure FormClose(Sender: TObject; var Action: TCloseAction);
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.DFM}
      function EnableHotKeyHook: Bool;external 'HKTest.DLL';
      function DisableHotKeyHook: Bool;external 'HKTest.DLL';procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
    begin
      if DisableHotKeyHook then
        Showmessage('HotKey Testing... DONE!!');
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
        if EnableHotKeyHook then
        Showmessage('HotKey Testing...');
    end;end.这样按Ctrl+B就可调出写字板了