2013-09-25 3 views
1

매번 "Hello"라는 메시지 상자가 표시되는 타이머가 있습니다. 나는 또한 코드가 구성되어 있으므로 창에 포커스가 없어지면 상자를 계속 유지하는 타이머가 멈춰야한다. 그러나 그들은 계속오고 있습니다.MsgBox가 손실 된 포커스 이벤트 VB.net을 트리거하지 않는 이유는 무엇입니까?

비슷한 프로그램에서 유사한 코드를 사용하여 비슷한 코드를 게시 해 보았습니다.하지만 은 처음 일시 중지되었으며 타이머가 다시 중지되었을 때 제대로 작동하지 않았습니다. 또한 무작위 요소가있는 다른 코드가 있었는데 특정 번호가 생성되었을 때 다른 프롬프트를 표시했지만 일단 생성되면 매번 동일한 프롬프트를 계속 사용했습니다.

모든 코드를 처리하는 데 시간이 부족하고 일부 코드가 "중첩"되는 오류가 있습니까? 그다지 다른 효과가없는 타이머를 지연시킬 수는 있지만,이 프로그램을 실행하고있는 나의 [저급] CPU는 1.6 GHz로 몇 개의 메시지 상자가있는 타이머를 처리 할 수 ​​있다고 생각합니다. 하지만 VS가 동시에 실행되고 있지만 테스트 할 때마다 코드를 내보내고 VS를 닫을 필요가 없습니다.

문제가 충분한 시간이 아니라면 내 프로그램이 "멀티 스레딩"또는 무엇을하고 있어도 방해 할 수 있습니까? 이상한 문제처럼 보이지만 컴퓨터는 너무 이상합니다. :P

편집 :하여

"포커스"나는 가장 명백하다 선택된 창을 의미한다. 예를 들어 내 브라우저가 이제 "집중"되어 있습니다. 정확한 용어가 "선택"되었음을 알게되었습니다. 나는 ... 이벤트 트리거의 잘못된 유형을 사용하고 있어야합니다 : P

+1

Form.Deactivate 해 보셨습니까? 그것은 형태가 집중력을 상실하고 더 이상 활동적인 형태가 아닐 때 발생합니다. " – Plutonix

답변

2

이 코드 Timer (Timer1)와 새 프로젝트를 만들고 쓰기 : 당신이 양식 위에 마우스를 놓으면

Private Sub Timer1_Tick(sender As System.Object, e As System.EventArgs) Handles Timer1.Tick 

    If (Me.Focused) Then 
     MessageBox.Show("Hello") 
    End If 

End Sub 

을 주어진 Interval이 끝나면 메시지 상자가 나타납니다. 수락 버튼을 클릭하지 않고 양식에 마우스를 올려 놓으면 더 이상 메시지가 표시되지 않습니다. Me.FocusFalse입니다. 동의 버튼을 클릭하면 메시지가 팝업으로 시작됩니다. 양식을 선택하지 않아도됩니다 (초점은 MessageBox에서 Form으로 자동 전송됩니다).

요약 : MessageBox은 수락 버튼을 클릭 한 후 자동으로 다시 돌아올 수있는 한 까다로운 "까다로운"것이지만 Form에 포커스를 잃게합니다. 이 경우 당신은 이유를 알고 싶어한다는 것입니다

Private Sub Form1_LostFocus(sender As Object, e As System.EventArgs) Handles Me.LostFocus 
    MsgBox("lost") 
End Sub 

말도 다른 답변/의견, 나는 당신의 질문에서 이해 무엇을 :

업데이트 : 제안 된 구성 형태의 LostFocus 이벤트를 트리거하지 않습니다 포커스를 잃을 양식을 만들기위한 실제 솔루션을 얻는 것보다는 정상적인 행동을 취하는 것입니다.

+0

그래서 마우스에 집중하지 못합니까? 나는 윈도우가 집중 윈도우를 더욱 명백하게 만드는 방식을 더 많이 언급했다. –

+0

@AnnonomusPerson 항상 "선택된"창/컨트롤이 있습니다. 이것은 포커스가있는 창/컨트롤입니다. 그것은 속성/조건에 따라 다른 방법으로 강조 표시됩니다. 너 정확히 원하는거야? – varocarbas

+0

나는 이것을 더 분명하게해야했다. 양식에서 언제 "선택"을 잃었는지 알고 싶습니다. 나는 틀린 재산을 사용해야 했음에 틀림 없다. 초점을 맞춘 것은보다 뚜렷한 모양의 창이라는 것입니다. 일반적으로 하나만있는 더 선명한 색상입니다. –

4

양식에 초점이 처음부터 없기 때문에 초점이 맞지 않는 이벤트가 생성되지 않습니다. 폼의 컨트롤은 Button이나 TextBox처럼 항상 포커스를받습니다. 대신 Deactivate 이벤트를 사용할 수 있습니다.

또는 Tick 이벤트가 다시 발생하면 메시지 상자를 표시하지 마십시오. 대략적으로 :

Private ShowingMsgBox As Boolean 

Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick 
    '' Do stuff 
    '' 
    If Not ShowingMsgBox Then 
     ShowingMsgBox = True 
     MsgBox("yada") 
     ShowingMsgBox = False 
    End If 
End Sub 

이 문제의 근본적인 원인은 MsgBox가 메시지 루프를 펌핑한다는 것입니다. WM_PAINT와 같이 정상적인 Windows 메시지가 전달되도록 유지합니다. 그리고 Tick 이벤트를 생성하는 WM_TIMER. 차단되는 유일한 종류의 메시지는 입력 이벤트, 마우스 및 키보드 메시지입니다. 그렇지 않으면 Application.DoEvents()가 매우 위험한 이유입니다. 입력을 비활성화하지 않고 MsgBox()와 동일한 작업을 수행합니다.

+0

나는 진술서를 오해하는 사람이 단 한 사람인지는 잘 모르겠지만 양식에 집중하지 못한다고 말하는 것처럼 보입니다. 폼에서 MessageBox를 트리거하는 이러한 접근 방식은 지나치게 신뢰할 만하지만 이론적으로는 문제가 없어야합니다. OP는 Form이 포커스를 잃지 않고 MessageBox가이 이벤트를 트리거하지 않는지를 이해하기 때문에. – varocarbas

+0

그래, 그게 내가 말하는거야. 집중과 활성화는 같은 것이 아닙니다. 폼에 포커스를받을 수있는 컨트롤이 폼에 있으면 포커스가있는 속성이 true가됩니다. 대답의 코드는 작동하지 않습니다. 컴파일도하지 않고, 직접 해보십시오. –

+0

왜 그런 말입니까? 나는 그것을 테스트했다 (나는 여기에 올린 모든 코드를 테스트한다). MsgBox 때문에? 몇 가지 실험을하고 있었지만 잘 작동합니다 (적어도 Option Strict Off로). 빈 폼을 만들고 두 메시지 상자가 아무 문제없이 트리거됩니다. – varocarbas

관련 문제