如何模拟按键事件?

问题描述:

我需要在网页浏览器控件中输入textbox中的内容。只需设置值不起作用,因为这不会运行JavaScript。如何模拟按键事件?

所以:

  1. InvokeMember:我想我可以用invokemember这个(因为有InvokeMember("Click"))。但谷歌对键盘事件保持沉默。

  2. 集中元素,然后将键发送到控件。它可以工作(Sendkeys.Send),但只有在控件被激活时才有效。如果我切换到另一个窗口,它将完全发送密钥,但不是我想要的位置。

  3. Javaspript:有没有办法找出当我更改文本框的值时运行哪个JavaScript?我不太了解JavaScript。元素属性没有像OnClick/OnKeyUp等。
+0

不知道我理解你的问题完全,但这里有几个环节#2现有的问题。 1. [通过编程方式改变文本框的值来调用javascript onchange事件](http://*.com/questions/735462/call-javascript-onchange-event-by-programatically-changing-textbox-value)2. [我如何使用jquery绑定onchange事件的文本框](http://*.com/questions/805963/how-do-i-bind-onchange-event-of-a-textbox-using-jquery) – Juba 2011-05-26 13:28:05

所以......如果有人问津。

  1. InvokeMember对按键没有任何作用。
  2. 它不可能向控件发送密钥。
  3. 有一种使用iQuery“发送密钥”的方法,这是......假的,设计不佳的。它对我的情况没有帮助。当它发送“发送密钥”时,“InvokeMember(”OnKeyUp“)”也起作用。

什么是可能的?它可能发送密钥到一个窗口... Teoretically它可能发送密钥到无效窗口(使用SendMessage()和PostMessage()),但几乎没有人成功完成此操作,因为WinXP & x 32倍...

我没有尝试自己,但也有人能够使用“SendInput”发送密钥。但反正这个没用,导致函数只能发送键到活动窗口。

所以... SendKeys.Send(我猜,它是SendInput的包装)仍然是最好的方法。

解决方案

我创建了一个表格(窗口)我的WebBrowser控件。我初始化它,但不使用“显示”。然后我简单地在“SendKeys.Send”之前激活这个表单(不要忘记关注元素(在控件内部)和控件(在表单内部)。由于没有任何表单可以显示,用户不会注意到任何内容,并且按键会进入正确的窗口。如果需要,可以保存之前激活的窗口句柄,并在发送后再次激活它(所以焦点不会丢失)。

摘要

虽然IM确定这个解决方案,我会使用它,它远非完美......如果有人发现更好的东西,请让我知道(甚至在遥远的未来)。

对于Java(而不是Javascript),您无法模拟通过DOM的按键点击。您需要模拟读取窗口点击(请参阅宏记录工具,如Autohotkey)

+0

我曾经与Autohotkey 2年前。现在几乎不记得任何事情。如果我记得好,它可以发送keyevents到不活动的形式。但是......我需要做它作为C#程序的一部分!所以Autohotkey是相当无用的,你知道如何在c#中做到这一点? – Alena 2011-05-28 18:38:20

+0

关于Autohotkey如何工作的想法实际上给了我一个主意......如果我将我的webbrowser控件放在窗体+隐藏的运行中,它可能会发送SendMessage键......它会有点愚蠢,但我想这是唯一的我可以让它工作。 – Alena 2011-05-28 18:45:32

关于此问题: 'Javaspript。有没有办法找出当我更改文本框的值时运行的JavaScript?我不太了解java。元素的属性没有像OnClick/OnKeyUp等'

要查看所有的JavaScript,你可以使用firebug插件的Firefox。它有相应的选项卡。

更多信息:http://getfirebug.com/whatisfirebug/

您可以设置一个破发点,并查看你想要所有的JavaScript变量。

万一有人碰到这种寻找火任何HTML和鼠标事件框架无关方式,看看这里:How to simulate a mouse click using JavaScript?

+0

模拟关键事件无用吗? – Alena 2011-05-28 10:21:23

+0

是的,它看起来像它:)它支持下列html事件:加载,卸载,中止,错误,选择,更改,提交,重置,焦点,模糊,调整大小,滚动。以下鼠标事件:点击,dblclick,mousedown,mouseup,mouseover,mousemove和mouseout。 – TweeZz 2011-05-28 11:57:06

您可以为每个caracter设置它并调用一个事件。在这个例子中我调用了keypress事件。为您输入的最后一个caracter调用事件。

he.setAttibtute("value", "a"); 
KeyEventArgs kea = new KeyEventArgs(Keys.A); 
he.InvokeMember("onkeypress", kea); 

在那里他是元素

+0

“he.setAttibtute”这是一个错字? – 2018-03-07 16:32:33