2

我将 .NET 的 WebBrowser 嵌入到具有其他一些按钮的表单中。

我正在开发的应用程序不使用键盘,而是使用触摸屏。所以它实际上只使用鼠标。为了向下滚动浏览器,我制作了两个自定义按钮。当我单击这些按钮时,它应该向浏览器发送“PageDown”键击,并且浏览器应该向下滚动。

所以点击事件的代码如下:

        theForm.Activate();
        Application.DoEvents();
        theBrowser.Focus();
        Application.DoEvents();
        SendKeys.Send(key);

其中“theForm”是表单,“theBrowser”是浏览器实例。

所以当我点击按钮时,什么也没有发生。当我第一次单击浏览器,然后单击按钮时,它确实有效。但是我把重点放在了对吗?我给了应用程序足够的空间来设置焦点?

但现在我觉得很奇怪。当我放一个 MessageBox.Show("HELLO"); 在代码中,像这样:

    theForm.Activate();
    Application.DoEvents();
    theBrowser.Focus();
    MessageBox.Show("HELLO");
    Application.DoEvents();
    SendKeys.Send(key);

...当我单击按钮时,它会立即工作。

 

所以问题是:为什么当我离开 MessageBox.Show() 时这段代码不起作用,但当我使用 MessageBox.Show() 时却起作用?

希望能帮到你,先谢谢了。。。

4

5 回答 5

1

无需考虑您的方法是否正确。(我怀疑不是)。

我会赌你有比赛条件。这意味着浏览器控件需要比您允许的更多时间来加载和响应事件。

因此,当您执行 Message.Show 时,您发送事件的线程突然被阻止,它正在让浏览器控件完成初始化或其他操作。

从您的问题中很难知道您是在移动设备上运行还是在常规桌面上运行,因为有更好的方法来处理触摸。查看用于多点触控或 WPF 4.0 的 Window7 Api(也由 Surface Touch SDK 共享)。

希望有帮助。爱丽儿

于 2009-05-26T08:03:24.007 回答
1

在我看来,这似乎是错误的做法。

尝试按照此C++ 示例或此C# 示例的方式进行操作。

如果您要模拟按键,至少要明确说明您要向其发送消息的 HWND。

于 2009-05-26T08:07:56.150 回答
0

可能是浏览器控件仍在加载文档,而消息框给了它足够的时间来完成。如果是这样,请等到浏览器的 IsBusy 属性为 false 或使用 DocumentCompleted 事件。

于 2009-05-26T08:03:26.783 回答
0

我不知道,但总的来说,根据我的经验,尝试像这样以编程方式改变焦点是一个坏主意,你总是最终会寻找错误。有很多方法可以让窗口滚动,所以也许你应该尝试其他方法?例如,Web 浏览器中的 JavaScript 可以有效地滚动窗口。

于 2009-05-26T08:04:04.287 回答
0

我怀疑你在这里有一场比赛,首先要做的是。聚焦控件可能不是即时的,并且您发送的击键去了其他地方,而在关闭消息框后,浏览器控件已经聚焦并获得了它的击键。

另外,引用 MSDN 关于Control.Focus()的注释:

Focus 是一种低级方法,主要用于自定义控件作者。相反,应用程序程序员应该对子控件使用Select方法或ActiveControl属性,或对窗体使用Activate方法。

所以使用其中之一可能比使用 Focus() 更好。

于 2009-05-26T08:04:27.750 回答