2014-05-22 44 views
0

我有一个vb.net应用程序,我想成为a)可见和b)最活跃的时候,将activewindow设置为我的要求 - 这部分我已经覆盖了罚款。循环背景工作

我希望能够做的是使用BackgroundWorker的主动监控这种在一个连续的循环 - 我再次报道了这关的罚款。

我遇到的问题是,当我选择组合框时,由于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

这很容易找出你自己的。简化代码。删除后台工作人员。你很可能会发现设置'Visible'或'TopMost'属性正在关闭下拉列表。 –

+0

如果删除了背景工作者,则没有适当的过程来主动观看活动窗口选择,即只有当Outlook是活动窗口时才应显示该应用程序,否则应设置为隐藏而不是最上层。 – user3664128

+0

我的评论是关于你调试你自己的代码。这不是一个解决方案。 –

回答

0

我想你应该在你的SetAppTopMost子添加额外的检查。

if Me.Visible = True then exit sub 

该行应该是第1行。既然你试图每隔100ms显示一次,你就失去了焦点。

1

如Praveen提到的,在设置它之前检查状态,以防止再次将焦点设置到窗口。

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”垃圾,或简单的设置一个标志,在你的主线程和轮询是在每次循环:另外,不要每次都重新创建backworker线如果您想取消,请退出/休息。

你也可以使用一个定时器,它不会锁定线程。