您的位置:首页 > 编程语言 > Delphi

delphi 模拟键盘

2010-04-10 09:46 253 查看
delphi模拟键盘输入可以通过发消息来实现,比如下面消息在编辑框formul中写入字符q:

POSTMESSAGE(formula.HANDLE,WM_KEYDOWN,Ord('q'),0) ;

当然还有其他多种实现方法,下面转载一个程序,里面用的方法很不错

unit FrmKeyboard;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, te_controls, ksthemebuttons, ksthemeengine, ksthemeforms,
StdCtrls, ExtCtrls;

type
TKeyboardFrm = class(TForm)
bttnQ: TButton;
bttnW: TButton;
bttnE: TButton;
bttnR: TButton;
bttnTab: TButton;
bttnO: TButton;
bttnP: TButton;
bttnCapsLock: TButton;
bttnBracketL: TButton;
bttnT: TButton;
bttnI: TButton;
bttnY: TButton;
bttnU: TButton;
ttemKey: TTeThemeEngine;
bttnS: TButton;
bttnD: TButton;
bttnF: TButton;
bttnG: TButton;
bttnA: TButton;
bttnColon: TButton;
bttnQuotation: TButton;
bttnH: TButton;
bttnL: TButton;
bttnJ: TButton;
bttnK: TButton;
bttnShiftL: TButton;
bttnX: TButton;
bttnC: TButton;
bttnV: TButton;
bttnB: TButton;
bttnZ: TButton;
bttnSlash: TButton;
bttnN: TButton;
bttnFullStop: TButton;
bttnM: TButton;
bttnComma: TButton;
bttnCtrlL: TButton;
bttnAltL: TButton;
bttnSpace: TButton;
bttnWinL: TButton;
bttnWinR: TButton;
bttnAltR: TButton;
bttnNull: TButton;
bttnShiftR: TButton;
bttnDoc: TButton;
bttnCtrlR: TButton;
TeThemeForm1: TTeThemeForm;
bttnBracketR: TButton;
bttn1: TButton;
bttn2: TButton;
bttn3: TButton;
bttn4: TButton;
bttnRipple: TButton;
bttn9: TButton;
bttn0: TButton;
bttnSubtract: TButton;
bttn5: TButton;
bttn8: TButton;
bttn6: TButton;
bttn7: TButton;
bttnEqual: TButton;
bttnUnSlash: TButton;
bttnBackSpace: TButton;
bttnEnter: TButton;
procedure bttnAClick(Sender: TObject);//模拟键盘
procedure FormCreate(Sender: TObject);//创建窗口
procedure myWM_ACTIVATE(var Message: TMessage); message WM_ACTIVATE;//截获消息
private
{ Private declarations }
procedure LoadGlyph;//装入图标
public
{ Public declarations }
end;
TStateMeal= (Ctrl,Alt,Shift);//定义一个集合
TStateArray= array[Ctrl..Shift] of Boolean;//定义一个数组(数组下标为集合类型)

var
KeyboardFrm: TKeyboardFrm;
StateArray: TStateArray;
gblIcoFilePath: string;//图标文件路径,位于程序的key目录下
HActWin,Hself: HWND;

implementation

{$R *.dfm}

{***********************************************************}
{* 模拟键盘 *}
{***********************************************************}
{* 功能:模拟键盘 *}
{* 说明:1.按纽的Tag属性存放相应键的虚拟键值(十进制) *}
{* 2.根据相应的按纽传递其Tag值,(即虚拟键值键值) *}
{* 3.程序以case语句为主,便于判断与理解 *}
{* 4.所有按纽的OnClick事件均为按纽"A"的OnClick事件 *}
{*=========================================================*}
procedure TKeyboardFrm.bttnAClick(Sender: TObject);
var
focushld,windowhld:hwnd;
threadld:dword;
Key: integer;
begin

//焦点定位,以便接受键盘输入
SetActiveWindow(HActWin);
windowhld:=GetForegroundWindow;
threadld:=GetWindowThreadProcessId(Windowhld,nil); //Windowhld
AttachThreadInput(GetCurrentThreadId,threadld,true);
Focushld:=getfocus;
AttachThreadInput(GetCurrentThreadId,threadld,false);
if focushld = 0 then Exit;

//开始模拟键盘
Key:= (Sender as TButton).Tag;
case Key of
//双字符键的模拟
48..57,65..90,111,188..190,186,187,220,221,222,219 :
begin
keybd_event(key,MapVirtualKey(key,0),KEYEVENTF_KEYUP,0);//释放键
keybd_event(key,MapVirtualKey(key,0),0,0);//按下键
//释放控制键
if StateArray[Ctrl] then keybd_event(17,MapVirtualKey(17,0),KEYEVENTF_KEYUP,0);
if StateArray[Alt] then keybd_event(18,MapVirtualKey(18,0),KEYEVENTF_KEYUP,0);
if StateArray[Shift]then keybd_event(16,MapVirtualKey(16,0),KEYEVENTF_KEYUP,0);
end;

//按制键的模拟(Shift,Ctrl,Alt)
16 :
begin
keybd_event(key,MapVirtualKey(key,0),0,0);//按下键
StateArray[Shift]:=true;
end;
17 :
begin
keybd_event(key,MapVirtualKey(key,0),0,0);//按下键
StateArray[Ctrl]:=true;
end;
18 :
begin
keybd_event(key,MapVirtualKey(key,0),0,0);//按下键
StateArray[Alt]:=true;
end;

//Tab键的模拟{这里考虑到了Alt+Tab的模拟}
9 :
begin
keybd_event(key,MapVirtualKey(key,0),0,0);//按下键
keybd_event(key,MapVirtualKey(key,0),0,0);//释放键
if StateArray[Shift] then {考虑Alt+Tab的模拟}
keybd_event(18,MapVirtualKey(18,0),0,0);//释放键
end

//其它键的模拟{简单的按下然后释放}
else
begin
keybd_event(key,MapVirtualKey(key,0),0,0);//按下键
keybd_event(key,MapVirtualKey(key,0),KEYEVENTF_KEYUP,0);//释放键
end;
end;
end;

{***********************************************************}
{* 截获 WM_ACTIVATE 消息 *}
{***********************************************************}
{* 功能:获得输入句柄 *}
{* 日期:2002年11月20日 *}
{* 作者: *}
{*=========================================================*}
procedure TKeyboardFrm.myWM_ACTIVATE(var Message: TMessage);
begin
if Message.wParam = WA_CLICKACTIVE then
begin
//SetActiveWindow(message.lParam);
if (HActWin<>message.lParam) and (message.lParam<>Hself) then
HActWin:=message.lParam;
end;
end;

{***********************************************************}
{* 程序初始化 *}
{***********************************************************}
{* 功能:数组变量赋初值false *}
{* 日期:2002年11月20日 *}
{* 作者: *}
{*=========================================================*}
procedure TKeyboardFrm.FormCreate(Sender: TObject);
begin
StateArray[Ctrl]:= false;
StateArray[Alt]:= false;
StateArray[Shift]:= false;
Hself:= KeyboardFrm.Handle;
KeyboardFrm.LoadGlyph;
end;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: