为什么当我在中间使用 MessageBox.Show() 时我的代码可以工作,而没有它就无法工作?

StackOverflow https://stackoverflow.com/questions/909465

  •  05-09-2019
  •  | 
  •  

我将.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() 时却起作用?

希望您能帮忙,先谢谢了...

有帮助吗?

解决方案

对我来说,这似乎是错误的处理方式。

尝试一些类似的事情 C++ 示例 或这个 C# 示例.

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

其他提示

没有进入你的方法是否正确。 (我怀疑是不是)。

我赌你有一个竞争条件。 这意味着浏览器控件需要更多的时间来加载和事件比你让它回应。

所以,当你做Message.Show,突然您发送的事件线程被阻塞,它是让浏览器控制完整intializing或别的东西。

这是很难从你的问题就知道,因为有更好的方法来处理触摸,无论您是移动,还是普通桌面运行。看Window7的API,用于多点触摸或WPF 4.0(由表面的触摸SDK藏汉共享)。

希望有所帮助。 爱丽儿

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

我不知道,但一般在我的经验,这是一个坏主意,试图以编程方式更改焦点这样,你最后总是一个错误追捕。有很多方法来让Windows虽然滚动,所以也许你应该尝试别的东西?例如JavaScript中的网络浏览器能有效地滚动窗口。

我怀疑你们在这里进行一场比赛,先完成什么。控件的焦点可能不是瞬时的,并且您发送的击键去了其他地方,而关闭消息框后,浏览器控件已经获得焦点并获取其击键。

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

Focus 是一种低级方法,主要供自定义控件作者使用。相反,应用程序程序员应该使用 选择 方法或 主动控制 子控件的属性,或者 启用 表格的方法。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top