C# 为什么我的代码在中间使用MessageBox.Show()时工作,没有它就不能工作?

C# 为什么我的代码在中间使用MessageBox.Show()时工作,没有它就不能工作?,c#,.net,messagebox,C#,.net,Messagebox,我将.NET的WebBrowser嵌入到一个具有其他按钮的表单中 我正在开发的应用程序不使用键盘,而是使用触摸屏。所以它实际上只使用鼠标。为了向下滚动webbrowser,我制作了两个自定义按钮。当我点击这些按钮时,它会向浏览器发送一个“PageDown”键,浏览器会向下滚动 因此,单击事件的代码如下所示: theForm.Activate(); Application.DoEvents(); theBrowser.Focus();

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

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

因此,单击事件的代码如下所示:

        theForm.Activate();
        Application.DoEvents();
        theBrowser.Focus();
        Application.DoEvents();
        SendKeys.Send(key);
其中“theForm”是表单,“theBrowser”是浏览器实例

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

但现在我觉得很奇怪。当我放一个消息框时,显示(“你好”);在代码中,如下所示:

    theForm.Activate();
    Application.DoEvents();
    theBrowser.Focus();
    MessageBox.Show("HELLO");
    Application.DoEvents();
    SendKeys.Send(key);
…当我点击按钮时,它会立即起作用

 

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


希望您能提供帮助,提前感谢……

而不必讨论您的方法是否正确。(我怀疑事实并非如此)

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

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

从你的问题中很难知道你是在移动设备上运行,还是在普通桌面上运行,因为有更好的方法来处理触摸。查看Window7 Api for multi-Touch或WPF 4.0(Surface Touch SDK也共享)

希望有帮助。
Ariel

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

我不知道,但根据我的经验,通常尝试以编程方式更改焦点是个坏主意,因为这样会导致错误查找。有很多方法可以让windows滚动,所以也许你应该试试别的方法?例如,web浏览器中的JavaScript可以有效地滚动窗口。

我怀疑您在这里有一个竞赛,首先要做什么。聚焦控件可能不是即时的,您发送的击键会转到其他位置,而在关闭消息框后,浏览器控件已经聚焦并获得其击键

此外,请引用MSDN中关于以下内容的注释:

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


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

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

试着做一些类似这样或这样的事情


如果要模拟按键操作,至少要明确说明要将消息发送到的HWND

即使我让一个页面完全加载,同样的情况也会发生……应用程序不应该处理这个问题吗?我的意思是,我在这两者之间得到了时间来真正关注控制……那个c#样本真的帮了大忙!非常感谢。C#sample链接现在似乎已断开。