我在winforms app(c#)中使用了webbrowser控件。当它正在进行自动化操作时,我正在从我正在使用的窗口中失去焦点控制。 Web浏览器的形式也没有出现,我只是失去了控制器的焦点。我现在正在写这条消息,我必须一次又一次地点击进入文本框......
如何在webbrowser中禁用此类行为?
我创建了这样的隐形web浏览器:
var br = new WebBrowser();
br.Visible = false;
br.ScriptErrorsSuppressed = true;
请告知。
答案 0 :(得分:15)
我遇到了同样的问题:
Webbrowser Control会在加载URL后从应用程序中获取焦点。
这对我有用:
Webbrowser.Navigate()
方法调用之前,将Web浏览器的父控件设置为Enabled = false
。DocumentCompleted
事件中,将Web浏览器的父控件重置为Enabled = true
。您无法直接在Webbrowser上执行此操作,因为不支持WebBrowserBase.Enabled
。
让我知道它是否适合你。
答案 1 :(得分:2)
您可以尝试通过SystemParametersInfo api全局禁用它。使用SPI_SETFOREGROUNDLOCKTIMEOUT
。设置前景锁定是全局设置,因此您需要在完成后清除此设置。更永久的解决方案是更改HKCU\Control Panel\Desktop\ForegroundLockTimeout注册表项。另请参阅social.msdn上的this discussion(特别是billb08的回答)。
答案 2 :(得分:2)
我猜WebBrowser
通过调用Navigate
(或导致导航的Click
HtmlElement
方法)加载页面后获得焦点。重点可以回到TextBox
的{{1}}事件处理程序中窗口上的控件(DocumentComplete
),但这非常困难:
您何时可以确定哪个控件拥有焦点
本来?在致电WebBrowser
之前?这还不够,因为
用户可以在调用Navigate
之后移动到另一个控件,但之前
处理Navigate
。
将焦点设置为DocumentComplete
的AFAIK将选择其整体
内容,所以你必须把光标放回原来的
位置。但是你什么时候存储原来的位置?同样的问题。
单个后可以有多个DocumentComplete事件
TextBox
(或Navigate
)。
可能的解决方案是为隐藏的Click
创建单独的应用程序。第二个应用程序将是不可见的,并且可以使用某种进程间通信(IPC)技术与原始GUI应用程序通信。因为在这种情况下WebBrowser
将在不同的过程中运行,所以你最好不要失去焦点并打扰用户。
答案 3 :(得分:2)
这是一个非常复杂的问题需要修复,应该由微软修改,只是窃取焦点的应用程序不合逻辑,它确实取决于网站正在做什么。我不得不求助于CBT过滤器,请参阅http://msdn.microsoft.com/en-us/magazine/cc188966.aspx,并过滤掉不需要的HCBT_ACTIVATE和HCBT_SETFOCUS(返回1;)。您可以使用GetWindowClass(wParam)来查看正在发生的事情。
即使上面没有完全发挥作用,应用程序窗口仍会暂时弹出到前面,因此使用当前位于前台的窗口上的SetWindowPos HWND_TOPMOST和HWND_NOTOPMOST。 HCBT_SETFOCUS在第一组HWND_TOPMOST和最后一组HWND_NOTOPMOST上被击中2或3次。计算多少个classname ==“Internet Explorer_Server”应该是2(或者可能取决于网站?),另一个是“Shell嵌入”,但并不总是发生。希望它有所帮助。
答案 4 :(得分:2)
我正在查看这个问题的所有其他答案,但他们并没有为我工作,但我看到了一个关于设置Browser.Parent.Enabled = false;我试过这样并且出了错误,所以我尝试了这个而不是它只是浮现在脑海中。
Browser.Parent = new Control();
Browser.Parent.Enabled = false;
现在问题已经完全消失了,它不会再带走焦点了。 我使用Web浏览器类作为变量,它不在我的表单上。 这对我有用,尝试一下,这似乎是100%的解决方案。
答案 5 :(得分:0)
argv = {
"test",
"--datadir=" & Replace(App.Path, "\", "/") & "/sql/data",
"--basedir=" & Replace(App.Path, "\", "/") & "/sql",
"--no-defaults",
"--skip-networking"
}
groups = {
"embedded",
"server",
"test_SERVER"
}
if mysql_server_init ( argc , argv , groups ) then
mysql = mysql_init(0) <== Causing problem [ pic error message]
else
MsgBox "Init not Done".
end if
答案 6 :(得分:0)
我将焦点发送回表单的解决方案:
Private Sub Web_DocumentCompleted(sender As Object, e As WebBrowserDocumentCompletedEventArgs) Handles Web.DocumentCompleted
If Me.Visible = False Then
For Each f As Form In My.Application.OpenForms
If TypeOf f Is frmLogin Then
Dim fl As frmLogin = DirectCast(f, frmLogin)
If fl.Visible = True Then
fl.Focus()
Exit For
End If
End If
Next
End If
End Sub