keybd_event的问题 ( 积分: 100 )

  • 主题发起人 主题发起人 追月
  • 开始时间 开始时间

追月

Unregistered / Unconfirmed
GUEST, unregistred user!
各位,在练习keybd_event这个函数时遇到一些问题,请大伙指教。<br>我想用keybd_event模拟用户按下的任意键(不包括中文字符),如下:<br>var<br> &nbsp;tmp:string;<br> &nbsp;i:Integer;<br>begin<br> &nbsp;for i:=1 to length(tmp) do<br> &nbsp;begin<br> &nbsp; &nbsp;keybd_event(ord(tmp),0,0,0);<br> &nbsp; &nbsp;keybd_event(ord(tmp),0,KEYEVENTF_KEYUP,0);<br> &nbsp;end;<br>end;<br>1.当tmp变量为'China',结果却变成了china,当tmp变量为'china'时,输出的结果却变成了数字,怎么回事??<br>2.请问我若想模拟输出和变量一模一样的结果该怎么办?(大小写都要区分,并且能模拟各种符号_+#@)<br>
 
各位,在练习keybd_event这个函数时遇到一些问题,请大伙指教。<br>我想用keybd_event模拟用户按下的任意键(不包括中文字符),如下:<br>var<br> &nbsp;tmp:string;<br> &nbsp;i:Integer;<br>begin<br> &nbsp;for i:=1 to length(tmp) do<br> &nbsp;begin<br> &nbsp; &nbsp;keybd_event(ord(tmp),0,0,0);<br> &nbsp; &nbsp;keybd_event(ord(tmp),0,KEYEVENTF_KEYUP,0);<br> &nbsp;end;<br>end;<br>1.当tmp变量为'China',结果却变成了china,当tmp变量为'china'时,输出的结果却变成了数字,怎么回事??<br>2.请问我若想模拟输出和变量一模一样的结果该怎么办?(大小写都要区分,并且能模拟各种符号_+#@)<br>
 
procedure TForm1.Button1Click(Sender: TObject);<br>var<br> &nbsp;tmp:string;<br> &nbsp;i:Integer;<br> &nbsp;GetKey : Integer;<br>begin<br> &nbsp;Edit1.SetFocus;<br> &nbsp;Edit1.SelectAll;<br> &nbsp;Sleep(2000);<br><br> &nbsp;tmp := 'China';<br> &nbsp;for i:=1 to length(tmp) do<br> &nbsp;begin<br> &nbsp; &nbsp;GetKey := ord(tmp);<br> &nbsp; &nbsp;if (GetKey &amp;gt;= 65) and (GetKey &amp;lt;= 90) then // A..Z 大写<br> &nbsp; &nbsp;begin<br> &nbsp; &nbsp; &nbsp;keybd_event(VK_LSHIFT,0,0,0);<br> &nbsp; &nbsp; &nbsp;keybd_event(GetKey,0,0,0);<br> &nbsp; &nbsp; &nbsp;keybd_event(GetKey,0,KEYEVENTF_KEYUP,0);<br> &nbsp; &nbsp; &nbsp;keybd_event(VK_LSHIFT,0,KEYEVENTF_KEYUP,0);<br> &nbsp; &nbsp;end<br> &nbsp; &nbsp;else if (GetKey &amp;gt;= 97) and (GetKey &amp;lt;= 122) then // a..z 小写<br> &nbsp; &nbsp;begin<br> &nbsp; &nbsp; &nbsp;GetKey := GetKey - 32;<br> &nbsp; &nbsp; &nbsp;keybd_event(GetKey,0,0,0);<br> &nbsp; &nbsp; &nbsp;keybd_event(GetKey,0,KEYEVENTF_KEYUP,0);<br> &nbsp; &nbsp;end<br> &nbsp; &nbsp;else &nbsp; &nbsp; // 其它的也<br> &nbsp; &nbsp;begin<br> &nbsp; &nbsp; &nbsp;keybd_event(GetKey,0,0,0);<br> &nbsp; &nbsp; &nbsp;keybd_event(GetKey,0,KEYEVENTF_KEYUP,0);<br> &nbsp; &nbsp;end;<br> &nbsp;end;<br>end;
 
不明的话<br>建一个From1,加入下面的代码看看就知的了<br>procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);<br>begin<br><br> &nbsp;Label2.Caption := Key ;<br> &nbsp;Label3.Caption := IntToStr(Ord(Key));<br> &nbsp;Key := #0 ;<br> &nbsp;Memo1.Lines.Add('press');<br>end;<br><br>procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;<br> &nbsp;Shift: TShiftState);<br>begin<br><br> Label1.Caption:=IntToStr(key);<br> Key := 0 ;<br> Memo1.Lines.Add('down');<br>end;
 
上面的错误,<br> keybd_event函数只可以模拟ord 1 - 254 之间的值,比如'/'无法模拟
 
直接用sendmessage 或postmessage都可以实现
 
to antong<br><br>是可以的<br>不信可以试下<br><br> &nbsp; &nbsp; &nbsp;keybd_event(191,0,0,0);<br> &nbsp; &nbsp; &nbsp;keybd_event(191,0,KEYEVENTF_KEYUP,0);
 
谢谢各位朋友的热情答复,我个人感觉用keybd_event很慢,当tmp变量的内容很庞大时,可以明显感觉到模拟速度的缓慢。不知还有没有更好的办法。
 
当tmp变量的内容很庞大时?????有多大啊?
 
to gooodlife<br> &nbsp; &nbsp;用你说的这种方法,<br> &nbsp; &nbsp; &nbsp;keybd_event(191,0,0,0);<br> &nbsp; &nbsp; &nbsp;keybd_event(191,0,KEYEVENTF_KEYUP,0); &nbsp;<br>确实可以模拟'/',但问题是tmp变量里面的内容不会是191的数字,而是'/',而'/'用ord函数转换出来的结果却是47,这样一来,是不是会出现错误的结果。因为我是菜鸟,如果问题很菜,请不要介意。<br><br>
 
if Value = 47 then<br> &nbsp;Value: = 191<br>就可以了吧<br><br>你要做全部的话就要知道全部的值是ord 值和 Key 值的差别了<br>用我上面给你那个 OnKeyPreee 和 OnKeyDown 看看两个的差别吧
 
模拟的结果不是在当前Form,而是在另外的窗口。
 
只有当前得到焦点的控件才有效,,,那个窗口都没有问题吧<br><br>不明白吗?<br>
 
接受答案了
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
916
SUNSTONE的Delphi笔记
S
后退
顶部