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.
我试过啦,改成WM_KEYDOWN,按什么键还是没反应。 procedure TForm1.TempOnMessage(var Msg: TMsg; var Handled: Boolean); begin if Msg.message=WM_KEYDOWN then showmessage('test'); end; 改成这样,应该按任意键都会显示提示框吧,现在怎么不行?
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.
这个是按键盘任意键就定位到edit1吗,我试了怎么不行?
就是典型的VC程序中:
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
我试过啦,改成WM_KEYDOWN,按什么键还是没反应。
procedure TForm1.TempOnMessage(var Msg: TMsg; var Handled: Boolean);
begin
if Msg.message=WM_KEYDOWN then
showmessage('test');
end; 改成这样,应该按任意键都会显示提示框吧,现在怎么不行?
肯定是可以的,我测试完后真个单元拷贝过来的.
这个代码是form1为当前窗口时,按键盘,才可以定位到edit1,打开其他窗口后再按键盘就不行啦。
如果你要求是这种情况,最终可行的解决方法是:
1、创建一个内存映射文件。并把FORM1的HANDLE值放到内存映射文件中。
2、全局HOOK键盘,在HOOK的DLL的开始时判断加载DLL的进程是否是扫描ID卡程序进程。
3、如果不是扫描ID卡程序进程,则读取内存映射文件中的EDIT1的HANDLE值。备以后向EDIT1发送消息。
4、响应WM_KEYDOWN,如果你要你的进程响应其它进程的键盘消息,则向EDIT1发送消息,同时正常派发此进程的消息(不影响此进程的键盘消息)。
在这也只能写个大概吧,具体代码你自己去实现吧。
这样最省事了。网吧都是那样做的。钩子的话,你怎么知道那个读卡器的Key值呢?