2014-05-22 47 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線如果您想取消,請退出/休息。

你也可以使用一個定時器,它不會鎖定線程。