程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> 監控鍵盤並在得到特定按鍵後輸出特殊字到剪貼板

監控鍵盤並在得到特定按鍵後輸出特殊字到剪貼板

編輯:Delphi

     打字時,輸入特殊字符總是那麼令人討厭,像α、β、γ、μ、π、Φ、Δ、℃、℉、£之類。為了簡化這些字符的輸入,設計了這個程序。不過,這裡只是捕捉“A”,然後把“α”字符送到剪貼板。為了使程序比較實用,請自己加入判斷Ctr,Alt、shift按鍵是否toggled的代碼,我就不寫全了。
     設計思路,設計後台線程監控鍵盤,看有哪些按鍵按下了。當發現“A”按下(其實如果要實用的話應該是判斷Ctr+shit+A,以免沖突)後,把“α”字符送到剪貼板,然後,用Ctr+V就可以貼到你想輸出到的地方了。
     具體實現,建立一個窗體,添加兩個按鈕,一個用來啟動hook,一個用來unhook。這裡用了日志鉤子,這樣它本身就是後台線程了,無論窗體是否Active,都能運行。在鉤子裡,用一個EVENTMSG來得到鍵盤按鍵的信息,消息裡的Paraml的低位就是按下的按鍵的ASCII碼,得到這個,就可以打開剪貼板,清空,設置Format,設置剪貼板內容了。這樣就大功告成了。
     為了寫這一段代碼,我看了hubdog整理《Delphi之未經證實的葵花寶典》(version 2.5)所有關於鉤子和剪貼板的文章,搜遍了csdn《程序員大本營》Delphi部分的文章和帶源碼的控件或程序。花了我十幾個小時,才寫出來了。結果實際上就是十幾行代碼。
     哎!編程這東西,不是不會,而是不知道呀!如果那位高手設法捕捉活動窗口,用WM_CopyData或IPC機制,把字符直接輸出到當前想輸出到的地方,那就完美了。我累了,暫時就先用剪貼板吧!

  
  unit Unit1;

  interface

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

  type
    TForm1 = class(TForm)
      Button1: TButton;
      Button2: TButton;
      procedure FormCreate(Sender: TObject);
      procedure Button1Click(Sender: TObject);
      procedure Button2Click(Sender: TObject);
    private
      { Private declarations }
    public
      { Public declarations }
    end;

   

  var
  Form1: TForm1;
  hHook:integer;
  EventArr:EVENTMSG;

  implementation

  function HookProc(iCode:Integer;wParam:wParam;lParam:lParam):LRESULT;stdcall;
   var
        c:integer;

  
  begin
  Result := 0;
  If iCode < 0 then Result := CallNextHookEx(hHook,iCode,WParam,LParam);
   EventArr:=pEventMSG(lParam)^;//通過鉤子的Lparam參數,讓EventArr得到鍵盤的消息
  If iCode = HC_ACTION then  file://是否鉤到東西
    If EventArr.message=wm_keydown then Begin // 看按鍵是否被按下

         c:=lo(EventArr.paramL);//Paraml的低位就是按下的按鍵的ASCII碼
    if c=65 then
    begin

    clipboard.Open;//打開剪貼板,清空,設置Format,設置剪貼板內容
    clipboard.Clear;
    clipboard.Formats[CF_text];
    clipboard.setTextbuf(pchar('α'));
    Clipboard.Close;
    end;

  
    end;

  
  end;

  
  {$R *.dfm}

  procedure TForm1.FormCreate(Sender: TObject);
  begin
    Button1.Caption:='hook';
    Button2.Caption:='unhook';
    Button2.Enabled:=False;

  end;

  procedure TForm1.Button1Click(Sender: TObject);
  begin
    file://建立鍵盤操作消息hook鏈
    hHook:=SetWindowsHookEx(WH_JOURNALRECORD,HookProc,HInstance,0);
    Button2.Enabled:=True;
    Button1.Enabled:=False;

  end;

  procedure TForm1.Button2Click(Sender: TObject);
  begin
    UnHookWindowsHookEx(hHook);//卸鉤子
    hHook:=0;
    Button1.Enabled:=True;
    Button2.Enabled:=False;
   

  end;

  

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved