2011-05-26 79 views
0

我需要在網頁瀏覽器控件中輸入textbox中的內容。只需設置值不起作用,因爲這不會運行JavaScript。如何模擬按鍵事件?

所以:

  1. InvokeMember:我想我可以用invokemember這個(因爲有InvokeMember("Click"))。但谷歌對鍵盤事件保持沉默。

  2. 集中元素,然後將鍵發送到控件。它可以工作(Sendkeys.Send),但只有在控件被激活時纔有效。如果我切換到另一個窗口,它將完全發送密鑰,但不是我想要的位置。

  3. Javaspript:有沒有辦法找出當我更改文本框的值時運行哪個JavaScript?我不太瞭解JavaScript。元素屬性沒有像OnClick/OnKeyUp等。
+0

不知道我理解你的問題完全,但這裏有幾個環節#2現有的問題。 1. [通過編程方式改變文本框的值來調用javascript onchange事件](http://stackoverflow.com/questions/735462/call-javascript-onchange-event-by-programatically-changing-textbox-value)2. [我如何使用jquery綁定onchange事件的文本框](http://stackoverflow.com/questions/805963/how-do-i-bind-onchange-event-of-a-textbox-using-jquery) – Juba 2011-05-26 13:28:05

回答

1

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

  1. InvokeMember對按鍵沒有任何作用。
  2. 它不可能向控件發送密鑰。
  3. 有一種使用iQuery「發送密鑰」的方法,這是......假的,設計不佳的。它對我的情況沒有幫助。當它發送「發送密鑰」時,「InvokeMember(」OnKeyUp「)」也起作用。

什麼是可能的?它可能發送密鑰到一個窗口... Teoretically它可能發送密鑰到無效窗口(使用SendMessage()和PostMessage()),但幾乎沒有人成功完成此操作,因爲WinXP & x 32倍...

我沒有嘗試自己,但也有人能夠使用「SendInput」發送密鑰。但反正這個沒用,導致函數只能發送鍵到活動窗口。

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

解決方案

我創建了一個表格(窗口)我的WebBrowser控件。我初始化它,但不使用「顯示」。然後我簡單地在「SendKeys.Send」之前激活這個表單(不要忘記關注元素(在控件內部)和控件(在表單內部)。由於沒有任何表單可以顯示,用戶不會注意到任何內容,並且按鍵會進入正確的窗口。如果需要,可以保存之前激活的窗口句柄,並在發送後再次激活它(所以焦點不會丟失)。

摘要

雖然IM確定這個解決方案,我會使用它,它遠非完美......如果有人發現更好的東西,請讓我知道(甚至在遙遠的未來)。

0

對於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

0

關於此問題: 'Javaspript。有沒有辦法找出當我更改文本框的值時運行的JavaScript?我不太瞭解java。元素的屬性沒有像OnClick/OnKeyUp等'

要查看所有的JavaScript,你可以使用firebug插件的Firefox。它有相應的選項卡。

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

您可以設置一個破發點,並查看你想要所有的JavaScript變量。

0

萬一有人碰到這種尋找火任何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

0

您可以爲每個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