در برنامه میخوام با Ctrl+Q ارقام کارت اعتباری و غیره رو برای پرداخت قبض رو درج کنم.
میخوام مقادیری از یک ممو داخل چند ادیت ریخته بشه.با کلی درد سر بالاخره تونستم این کار رو بکنم. اما وقت همه ارقام وارد شدند هنوز کلید کنترل تحت فشار حساب میشه.
من همه کارها رو با KeyBd_Event انجام دام.
هنوز تعجب می کنم چرا لازم نیست KEYEVENTF_KEYUP هم برای شبیه سازی برداشتن دست از دکمه بذارم و اگر بذارم مثل فشارش هست.
در آخر چه KeyBd_Event(vk_Control,KEYEVENTF_KEYUP,0,0) بذارم چه نذارم.همون مشکل فشار کلید کنترل باقیه:

  private
{ Private declarations }
Procedure WMHotkey( Var msg: TWMHotkey ) ;message WM_HOTKEY;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
RegisterHotkey (Handle, 1, MOD_Control, Ord('Q'));
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
UnRegisterHotkey( Handle, 1) ;
end;
Procedure TForm1.WMHotkey( Var msg: TWMHotkey ) ;
var
I:Word;
S,Num:String;
E:TEdit;
Begin
If msg.hotkey = 1 Then
Begin
S:=Memo1.Text;
For I:=1 to Length(S) Do
if pos(S[I],'0123456789')>0 then
Num:=Num+S[I]
else if Num<>'' then
Begin
Edit1.Text:=Num;
Edit1.SelectAll;
Edit1.CopyToClipboard;
Num:='';
KeyBd_Event(vk_Control,0,0,0);
KeyBd_Event(ord('V'),0,0,0);
KeyBd_Event(vk_Control,KEYEVENTF_KEYUP,0,0);
KeyBd_Event(vk_Control,KEYEVENTF_KEYUP,0,0);
Application.ProcessMessages;
sleep(100);
if I<40 then
SendMessage(getForegroundWindow(), WM_NEXTDLGCTL, 0, 0 );
Application.ProcessMessages;
sleep(100);
End;
KeyBd_Event(vk_Control,KEYEVENTF_KEYUP,0,0);
End;
ShowMessage(IntToStr(GetKeyState(VK_CONTROL))
+#13+IntToStr(GetAsyncKeyState(VK_CONTROL)));
End;