我做了个ID打卡软件,用的是键盘口的ID读卡器,打卡时光标必须要停留在读卡的输入框内,否则卡号就没法写入软件,有什么办法在有人操作电脑时(做其他事),只要有人打卡(有键盘输入),就自动将光标定位在输入框内读卡?请大侠指点!!!

解决方案 »

  1.   

    截WM_CHAR 消息,然后设置EDIT焦点
      

  2.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        Edit1: TEdit;
        Edit2: TEdit;
        procedure FormCreate(Sender: TObject);
      private
        procedure TempOnMessage(var Msg: TMsg; var Handled: Boolean);
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
    begin
      Application.OnMessage:=Self.TempOnMessage;
    end;procedure TForm1.TempOnMessage(var Msg: TMsg; var Handled: Boolean);
    begin
      if Msg.message=WM_CHAR then
        if not Edit1.Focused then
        begin
          Edit1.SetFocus;
          SendMessage(Edit1.Handle,WM_CHAR,Msg.wParam,Msg.lParam);
        end;
    end;end.
      

  3.   


    这个是按键盘任意键就定位到edit1吗,我试了怎么不行?
      

  4.   

    只要是输入字符就可以.Application.OnMessage其实就是应用程序的消息队列,
    就是典型的VC程序中:
    while (GetMessage(&msg, NULL, 0, 0))
    {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
    }
      

  5.   

    你要想响应所有的键盘消息就去截获:WM_KEYDOWN
      

  6.   


    我试过啦,改成WM_KEYDOWN,按什么键还是没反应。
    procedure TForm1.TempOnMessage(var Msg: TMsg; var Handled: Boolean); 
    begin 
      if Msg.message=WM_KEYDOWN then 
        showmessage('test');
    end; 改成这样,应该按任意键都会显示提示框吧,现在怎么不行?
      

  7.   

    你新建一个项目,在窗口中加2个EDIT,1个BUTTON,把上面贴的代码一行不差的拷贝到原来的Unit1上.
    肯定是可以的,我测试完后真个单元拷贝过来的.
      

  8.   


    这个代码是form1为当前窗口时,按键盘,才可以定位到edit1,打开其他窗口后再按键盘就不行啦。
      

  9.   

    那只有HOOK键盘了,看GetActiveWindow得到的句柄是否=Form1.Handle。
    如果你要求是这种情况,最终可行的解决方法是:
    1、创建一个内存映射文件。并把FORM1的HANDLE值放到内存映射文件中。
    2、全局HOOK键盘,在HOOK的DLL的开始时判断加载DLL的进程是否是扫描ID卡程序进程。
    3、如果不是扫描ID卡程序进程,则读取内存映射文件中的EDIT1的HANDLE值。备以后向EDIT1发送消息。
    4、响应WM_KEYDOWN,如果你要你的进程响应其它进程的键盘消息,则向EDIT1发送消息,同时正常派发此进程的消息(不影响此进程的键盘消息)。
    在这也只能写个大概吧,具体代码你自己去实现吧。
      

  10.   

    我说,兄弟,就让那台机子的朋友自己注意切换一下吧。
    这样最省事了。网吧都是那样做的。钩子的话,你怎么知道那个读卡器的Key值呢?
      

  11.   

    使用钩子函数,截取截WM_CHAR 消息,然后设置相对应的EDIT的焦点