【问题标题】:Is it possible to sendkeys / Post Message directly to a HtmlElement rather than to a webbrowser control?是否可以将密钥/发布消息直接发送到 HtmlElement 而不是 Web 浏览器控件?
【发布时间】:2011-02-09 12:35:08
【问题描述】:

我想直接将键发送到 c# web 浏览器控件元素,而不仅仅是具有正确焦点的窗口。

现在我可以使用 PostMessage 和 documentHandle 发送密钥并像这样聚焦

即伪代码

HtmlElement el = getelement();
el.Focus();
IntPtr docptr = browser.Handle;
PostMessage(docptr,WM_KEYDOWN,1,0);
.... KEYCHAR, KEYUP..

我想知道是否有人知道可以在后台执行此操作的任何方法,以便焦点不在元素上。基本上有一种方法可以将 IntPtr 获取到 HtmlElement 本身,而不是在 PostMessage 或 SendKeys API 而不是浏览器句柄/ptr 中使用它。

【问题讨论】:

  • 与其描述您的解决方案以及如何使其发挥作用,不如描述您试图解决的问题。同时,如果您需要基本的 Web 应用程序测试人员,请参阅 seleniumhq.org
  • 我要解决的问题就是我要问的问题。我想直接将密钥发送到 HTMLElement,而不必通过窗口引用它并设置焦点。 aka 如何或有办法将 IntPtr 获取到 HtmlElement。我意识到那里有很多测试框架,我之前使用过的很多测试框架,比如 selenium,可以做这样的事情,但是我正在寻找一个 Win32/C# 解决方案。
  • HTML 元素没有自己的窗口(IE6 中的<select> 除外),因此它们不会有单独的句柄。

标签: c# browser sendkeys postmessage


【解决方案1】:

我花了很长时间才找到这个,但是您必须使用子命令 p/调用 GetWindow 以重复获取子窗口句柄,直到找到一个使用“Internet Explorer_Server”或类似的东西响应 GetClassName 的句柄.

然后该 hWnd 上的 PostMessage 和 WebBrowser 的 activeElement 将接收它们。确保那里有 WM_KEYUP,因为这似乎很重要。

【讨论】:

  • 您的回复对代码片段和关于类名的更明确的陈述或类似的东西会更有帮助。
【解决方案2】:

你不能。这些是无窗口控件,鼠标/键盘消息由它们的父窗口处理,父窗口只为活动控件中继消息。

【讨论】:

    【解决方案3】:

    看看 WaitN 和 Selenium 之类的东西。

    IE 也有很好的编程接口来控制浏览器。

    但也有缺点……

    我目前正在开发一个程序,该程序使用图像识别和鼠标/键控制来控制浏览器,因为我只能用视觉表示做我想做的事情。

    但是,这将控制计算机并需要完全控制。除非您在虚拟机中运行它。

    【讨论】:

    • 上面的问题是关于IE界面的。我正在寻找将密钥发送到 HtmlElement 的 .NET/C#/WIN32 解决方案;特别是避免将焦点设置在控件上并将消息发送到整个窗口。我在问是否有人将 sendkeys 直接发送到控件。
    • 如果你能找到你想要的元素的控件,你可以向它发送消息并直接设置文本,而不是向它发送键
    【解决方案4】:

    这是错误的方式。

    您可以使用HtmlElement API 直接操作元素。

    如需准确说明,请告诉我们您想要做什么。

    【讨论】:

    • 这是用于模拟击键的特定应用,例如触发 javascript 代码进行测试。我意识到您可以使用 .InvokeMemeber("click") 或 .SetAttribute("value", value)。但这不是我在这里谈论的。
    猜你喜欢
    • 1970-01-01
    • 2010-11-22
    • 1970-01-01
    • 2018-12-16
    • 1970-01-01
    • 2021-10-24
    • 2020-04-19
    • 1970-01-01
    • 2015-06-13
    相关资源
    最近更新 更多