2009-11-12 4 views
1

아래의 코드를 사용하여 :Form.Show로 양식 열기 : 첫 번째 마우스 클릭은 무시됩니다. 윈폼, 닷넷

Private Sub ShowDropDown() 
    Using f As New DropDownForm 
     f.Visible = True 
     Do While f.Visible 
      Application.DoEvents() 
      // Call to not take up 100% resources 
     Loop 
    End Using 
End Sub 

ShowDropDown 방법은 버튼 클릭 이외에 의해 호출되는 경우를, 다음 DropDownForm 최초의 마우스 클릭은 무시됩니다. 그래서 PictureBox 클릭 또는 양식 클릭에 따라 호출 된 경우에는 무시됩니다.

나는 아래 수행하여 문제를 해결할 수 :

Private Sub ShowDropDown() 
    Using f As New DropDownForm 
     f.Visible = True 
     Dim capture As IntPtr = GetCapture() 
     If (capture <> IntPtr.Zero) Then 
      SendMessage(New HandleRef(Nothing, capture), &H1F, IntPtr.Zero, IntPtr.Zero) 
      ReleaseCapture() 
     End If 
     Do While f.Visible 
      Application.DoEvents() 
     Loop 
    End Using 
End Sub 

반사판의 Form.ShowDialog 방법에보고 후, 추측했다.

제 질문은 동일한 결과를 얻을 수있는 관리 된 호출이 있고 버튼 클릭으로 다른 클릭이 수행하지 않는 작업은 무엇입니까?

ETA : 키를 사용하여 양식을 열면 문제가 발생하지 않습니다.

+0

- 당신이 사용할 수있는 Thread.sleep를 (0) Application.DoEvents에 대한 대안()가 100 %의 CPU를 정지로 ... Application.DoEvents를() 당신이 당신에게 부작용을 줄 수도 하지. –

+0

어떤 것이 더 좋을지 모르지만 Application.DoEvents()를 사용하고 MsgWaitForMultipleObjectsEx (0, IntPtr.Zero, 250, & HFF, 4)를 사용합니다. 이것이 PropertyGrid가 처리하는 방법입니다. – Jules

답변

2

예, 마우스 캡처가 문제입니다. 명시 적으로 Control.Capture 속성을 false로 설정하여 문제를 해결할 수 있습니다. 예를 들면 : 참고로

private void pictureBox1_Click(object sender, EventArgs e) { 
     pictureBox1.Capture = false; 
     ShowDropDown(); 
    } 
+0

그 점에 대해 감사 드리며, 더 간단한 방법이있을 것이라고 생각합니다. – Jules