请问各位如何实现虚拟键盘?现在一点概念都没有,因为如果我自己设计的按键后,焦点就自动跑到我设计的键盘上面了,原来我要输入的地方焦点一没我就不能输入字母在上面了,请问我应该如何做阿???如何做到即使我在自己设计的键盘上操作,而焦点仍然在我指定要输入的地方???谢谢
解决方案 »
- 请问大家 delphi2009 能否开发 在 Wince上运行的程序?
- 还是一个多人提到的问题
- 新手求救!
- 如何在一个窗体中调用另外一个窗体?
- 郁闷:如何获取sqlserver中某个存储过程的参数列表
- 李维D5 ADO/MTS/COM+高级程序设计书中几个不明白的问题
- 用Delphi+ADO如何动态备份SQL SERVER 2000 的数据库?急、急!
- 谁有可垂直居中的QRLabel?
- 请各位大虾帮忙!
- XP主题退出报错,原因是加了TXPManifest, 去掉没事.不知为什么?
- combobox的一个查询数据库的问题,请各位看看
- 我想让TreeView组件的TreeNode增加一个Integer域
用不能焦点的控件,如TSpeedButton等等。
当然窗口也要设置。
最好是自己绘制键盘到屏幕上,然后判断鼠标位置,根据位置作响应的事情。
如Bt_A
Bt_a.onclick(sender);
begin
Edit1.text:='A';//如果你要追加输入就改为:Edit1.text:=Edit1.text+'A';
end;如Bt_B
Bt_a.onclick(sender);
begin
Edit1.text:='B';//如果你要追加输入就改为:Edit1.text:=Edit1.text+'B';
end;如果要大小写就判断Shift是否按下
不知是否明白?
unit FrmKeyboard;interfaceuses
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;
begin
//获取图标文件路径
gblIcoFilePath:= ExtractFileDir(Application.ExeName)+'\key\';
//装入字母键图标
bttnA.Glyph.LoadFromFile(gblIcoFilePath+'A.bmp');
bttnB.Glyph.LoadFromFile(gblIcoFilePath+'B.bmp');
bttnC.Glyph.LoadFromFile(gblIcoFilePath+'C.bmp');
bttnD.Glyph.LoadFromFile(gblIcoFilePath+'D.bmp');
bttnE.Glyph.LoadFromFile(gblIcoFilePath+'E.bmp');
bttnF.Glyph.LoadFromFile(gblIcoFilePath+'F.bmp');
bttnG.Glyph.LoadFromFile(gblIcoFilePath+'G.bmp');
bttnH.Glyph.LoadFromFile(gblIcoFilePath+'H.bmp');
bttnI.Glyph.LoadFromFile(gblIcoFilePath+'I.bmp');
bttnJ.Glyph.LoadFromFile(gblIcoFilePath+'J.bmp');
bttnK.Glyph.LoadFromFile(gblIcoFilePath+'K.bmp');
bttnL.Glyph.LoadFromFile(gblIcoFilePath+'L.bmp');
bttnM.Glyph.LoadFromFile(gblIcoFilePath+'M.bmp');
bttnN.Glyph.LoadFromFile(gblIcoFilePath+'N.bmp');
bttnO.Glyph.LoadFromFile(gblIcoFilePath+'O.bmp');
bttnP.Glyph.LoadFromFile(gblIcoFilePath+'P.bmp');
bttnQ.Glyph.LoadFromFile(gblIcoFilePath+'Q.bmp');
bttnR.Glyph.LoadFromFile(gblIcoFilePath+'R.bmp');
bttnS.Glyph.LoadFromFile(gblIcoFilePath+'S.bmp');
bttnT.Glyph.LoadFromFile(gblIcoFilePath+'T.bmp');
bttnU.Glyph.LoadFromFile(gblIcoFilePath+'U.bmp');
bttnV.Glyph.LoadFromFile(gblIcoFilePath+'V.bmp');
bttnW.Glyph.LoadFromFile(gblIcoFilePath+'W.bmp');
bttnX.Glyph.LoadFromFile(gblIcoFilePath+'X.bmp');
bttnY.Glyph.LoadFromFile(gblIcoFilePath+'Y.bmp');
bttnZ.Glyph.LoadFromFile(gblIcoFilePath+'Z.bmp');
//装入数字键图标
bttn0.Glyph.LoadFromFile(gblIcoFilePath+'0.bmp');
bttn1.Glyph.LoadFromFile(gblIcoFilePath+'1.bmp');
bttn2.Glyph.LoadFromFile(gblIcoFilePath+'2.bmp');
bttn3.Glyph.LoadFromFile(gblIcoFilePath+'3.bmp');
bttn4.Glyph.LoadFromFile(gblIcoFilePath+'4.bmp');
bttn5.Glyph.LoadFromFile(gblIcoFilePath+'5.bmp');
bttn6.Glyph.LoadFromFile(gblIcoFilePath+'6.bmp');
bttn7.Glyph.LoadFromFile(gblIcoFilePath+'7.bmp');
bttn8.Glyph.LoadFromFile(gblIcoFilePath+'8.bmp');
bttn9.Glyph.LoadFromFile(gblIcoFilePath+'9.bmp');
//装入控制键图标
bttnCtrlL.Glyph.LoadFromFile(gblIcoFilePath+'Ctrl.bmp');
bttnCtrlR.Glyph.LoadFromFile(gblIcoFilePath+'Ctrl.bmp');
bttnAltL.Glyph.LoadFromFile(gblIcoFilePath+'Alt_L.bmp');
bttnAltR.Glyph.LoadFromFile(gblIcoFilePath+'Alt_R.bmp');
bttnShiftL.Glyph.LoadFromFile(gblIcoFilePath+'Shift.bmp');
bttnShiftR.Glyph.LoadFromFile(gblIcoFilePath+'Shift.bmp');
bttnWinL.Glyph.LoadFromFile(gblIcoFilePath+'Win_L.bmp');
bttnWinR.Glyph.LoadFromFile(gblIcoFilePath+'Win_R.bmp');
bttnTab.Glyph.LoadFromFile(gblIcoFilePath+'Tab.bmp');
bttnEnter.Glyph.LoadFromFile(gblIcoFilePath+'Enter.bmp');
bttnNull.Glyph.LoadFromFile(gblIcoFilePath+'Null.bmp');
bttnCapsLock.Glyph.LoadFromFile(gblIcoFilePath+'CapsLock.bmp');
bttnBackSpace.Glyph.LoadFromFile(gblIcoFilePath+'BackSpace.bmp');
bttnDoc.Glyph.LoadFromFile(gblIcoFilePath+'Doc.bmp');
bttnSpace.Glyph.LoadFromFile(gblIcoFilePath+'Space.bmp');
//装入其它双字符键图标
bttnRipple.Glyph.LoadFromFile(gblIcoFilePath+'Ripple.bmp');
bttnSubtract.Glyph.LoadFromFile(gblIcoFilePath+'Subtract.bmp');
bttnEqual.Glyph.LoadFromFile(gblIcoFilePath+'Equal.bmp');
bttnUnSlash.Glyph.LoadFromFile(gblIcoFilePath+'UnSlash.bmp');
bttnBracketL.Glyph.LoadFromFile(gblIcoFilePath+'Bracket_L.bmp');
bttnBracketR.Glyph.LoadFromFile(gblIcoFilePath+'Bracket_R.bmp');
bttnColon.Glyph.LoadFromFile(gblIcoFilePath+'Colon.bmp');
bttnQuotation.Glyph.LoadFromFile(gblIcoFilePath+'Quotation.bmp');
bttnComma.Glyph.LoadFromFile(gblIcoFilePath+'Comma.bmp');
bttnFullStop.Glyph.LoadFromFile(gblIcoFilePath+'FullStop.bmp');
bttnSlash.Glyph.LoadFromFile(gblIcoFilePath+'Slash.bmp');
end;end.