当我在中间使用MessageBox.Show()时,我的代码怎么工作,没有它就行不通?

时间:2009-05-26 07:54:12

标签: c# .net messagebox

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

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

所以click事件的代码如下:

        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()时呢?

希望你能提前帮助,谢谢......

5 个答案:

答案 0 :(得分:1)

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

我会赌你有竞争条件。 这意味着浏览器控件需要更多时间来加载和响应事件,而不是让它出现。

因此,当您执行Message.Show时,突然发送事件的线程被阻止,并且它允许浏览器控制完全初始化或其他内容。

很难从您的问题中了解您是在Mobile还是普通桌面上运行,因为有更好的方法来处理触摸。查看Window7 Api的多点触控或WPF 4.0(由Surface Touch SDK共享)。

希望有所帮助。 爱丽儿

答案 1 :(得分:1)

对我而言,这看起来是错误的方式。

尝试使用此C++ sample或此C# sample的内容。

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

我不知道,但总的来说,根据我的经验,尝试以编程方式更改焦点是一个坏主意,你总是最终找到一个bug。有很多方法可以让窗户滚动,所以也许你应该尝试别的东西?例如,Web浏览器中的JavaScript可以有效地滚动窗口。

答案 4 :(得分:0)

我怀疑你在这里有一场比赛首先完成的事情。聚焦控件可能不是即时的,你发送的击键去了其他地方,而在关闭消息框后,浏览器控件已经集中并进行击键。

另外,引用MSDN关于Control.Focus()的说明:

  

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

因此,使用其中一个可能比使用Focus()更好。