2014-05-22 2 views
0

나는 내가 만들고 싶어하는 vb.net 응용 프로그램을 가지고있다. b)는 activewindow가 나의 요구 사항에 맞추어 져있을 때 최상위 다 - 나는이 부분을 잘 다루었 다.루핑 backgroundworker

내가 할 수 있기를 원하는 것은 backgroundworker를 사용하여 연속 루프에서이를 적극적으로 모니터링하는 것입니다. 다시이 문제를 해결했습니다.

내가 겪고있는 문제는 내가 combobox를 선택할 때 bgw의 간섭으로 선택을 할 수 없다는 것입니다. 거의 내가 콤보 박스를 클릭하여 목록을 표시 할 때처럼 bgw가 거의 목록을 닫는 콤보 박스에서 멀리 클릭하십시오.

도움이된다면 크게 도움이 될 것입니다. 난 당신이 당신의 SetAppTopMost 하위에 추가 검사를 추가해야한다고 생각

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

:

여기 내 코드입니다.

이 줄은 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 스레드 매번 다시하지 않습니다 취소하려면 exit/break를 누르십시오.

스레드를 잠그지 않는 타이머를 사용할 수도 있습니다.