我有一个vb.net应用程序,我希望a)可见,b)当activewindow设置为我的要求时最顶层 - 这部分我已经完成了。
我希望能够做的是使用背景工作者在一个连续的循环中主动监视它 - 再次我已经完成了这个。
我遇到的问题是,当我选择组合框时,由于bgw的干扰,我无法进行选择 - 几乎就像当我点击组合框来显示列表时,bgw似乎几乎点击了远离关闭列表的组合框。
非常感谢任何帮助。
这是我的代码:
Private Delegate Sub progressDelegate()
Private Sub frmApp_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Me.bgwActiveWindow.RunWorkerAsync()
End Sub
Private Sub bgwActiveWindow_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bgwActiveWindow.DoWork
Dim CheckWindow As progressDelegate
CheckWindow = New progressDelegate(AddressOf SetAppTopMost)
Me.Invoke(CheckWindow)
System.Threading.Thread.Sleep(100)
End Sub
Private Sub SetAppTopMost()
Dim bol As Boolean
If getActiveWindowTitle.IndexOf("Microsoft Outlook") <> -1 Or _
getActiveWindowTitle.IndexOf(My.Settings.AppName) <> -1 Then
bol = True
Else
bol = False
End If
Me.Visible = bol
Me.TopMost = bol
End Sub
Private Sub bgwActiveWindow_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles bgwActiveWindow.RunWorkerCompleted
bgwActiveWindow.RunWorkerAsync()
End Sub
答案 0 :(得分:1)
Imports System.ComponentModel
Private Sub bgwActiveWindow_DoWork(ByVal sender As Object, ByVal e As DoWorkEventArgs) Handles bgwActiveWindow.DoWork
Do
' backworker code
Threading.Thread.Sleep(1000)
Loop While True
End Sub
当然,您要么必须实现'supportscancellation'垃圾,要么在主线程中设置一个标志,并在每个循环中轮询该标志,如果要取消则退出/退出。
你也可以使用一个不会锁定线程的计时器。
答案 1 :(得分:0)
我认为你应该在你的SetAppTopMost子中添加一个额外的检查。
if Me.Visible = True then exit sub
此行应为第1行。由于你试图每隔100毫秒显示一次表格,你就会失去焦点。