打字時,輸入特殊字符總是那麼令人討厭,像α、β、γ、μ、π、Φ、Δ、℃、℉、£之類。為了簡化這些字符的輸入,設計了這個程序。不過,這裡只是捕捉“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;