请问各位如何实现虚拟键盘?现在一点概念都没有,因为如果我自己设计的按键后,焦点就自动跑到我设计的键盘上面了,原来我要输入的地方焦点一没我就不能输入字母在上面了,请问我应该如何做阿???如何做到即使我在自己设计的键盘上操作,而焦点仍然在我指定要输入的地方???谢谢

解决方案 »

  1.   

    按键
    用不能焦点的控件,如TSpeedButton等等。
    当然窗口也要设置。
    最好是自己绘制键盘到屏幕上,然后判断鼠标位置,根据位置作响应的事情。
      

  2.   

    呵呵,问题挺简单。在form上画上N个button代表不同的按键在每个按键的onclick事件里面加入输出的字符,你要显示在Edit1里面
    如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是否按下
    不知是否明白?
      

  3.   

    别人的代码:
    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;
      

  4.   

    procedure TKeyboardFrm.LoadGlyph;
    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.