我有以下场景:Delphi XE7和Android模拟器环境(Andy)。我使用以下命令在Windows环境中粘贴文本以正常运行:
procedure TForm1.Button1Click(Sender: TObject);
begin
keybd_event(VK_CONTROL, MapVirtualKey(VK_CONTROL, 0), 0, 0);
keybd_event(Ord('V'), MapVirtualKey(Ord('V'), 0), 0, 0);
keybd_event(Ord('V'), MapVirtualKey(Ord('V'), 0), KEYEVENTF_KEYUP, 0);
keybd_event(VK_CONTROL, MapVirtualKey(VK_CONTROL, 0), KEYEVENTF_KEYUP, 0)
end;
formstyle选项表单设置为fsStayOnTop 现在运行Android模拟器,我需要将文本粘贴到模拟器中的Google搜索栏中,并且粘贴命令不起作用。
我注意到如果我按住鼠标右键2秒,就会出现粘贴选项(Android环境)并点击它我可以粘贴,但我需要它是自动的。有什么建议吗?
答案 0 :(得分:0)
键盘输入由前景窗口处理。您正在将键击注入到键盘本身将用户输入发布到的同一低级输入队列中(顺便说一下,您应该使用SendInput()
而不是keybd_event()
)。您模拟的击键会经历用户输入的击键所经历的所有相同处理和路由。 Raymond Chen在他的网站上有一个很好的描述:
When something gets added to a queue, it takes time for it to come out the front of the queue
当您点击按钮时,您应用的窗口就在前台。因此,您的 Ctrl-V 序列会被您的应用程序接收,而不是由Andy模拟器接收。如果您使用TWinControl
- 派生按钮,例如TButton
,则会在点击时获取输入焦点(为避免这种情况,请使用TGraphicControl
- 派生按钮,例如TSpeedButton
)。由于编辑控件没有聚焦, Ctrl-V 似乎什么都不做,因为处理键盘时没有任何内容可以粘贴。
你需要使用 即使这样,也没有100%保证某些其他应用程序无法在您发出键击的时间和它们从输入队列中出来的时间之间窃取焦点。SetForegroundWindow()
(也许还有SetFocus()
)将Andy的窗口带回前台并在之前将输入焦点设置为然后发送你的击键。< / p>