2012-05-03 3 views
0

양식 처리가 필요한 클래스를 작성하고 있지만 클래스 생성자 또는 속성에서 인수로 보내지 않고 사용할 수있는 방법이 있습니까?인수로 전달하지 않고 vb.net 클래스에서 양식 핸들을 사용합니까?

양식이 완전히로드 될 때까지 처리기가 설정되어 있지 않으므로 다른 문제도 있음을 알고 있습니다.

기본적인 아이디어는 인수로 전달하지 않고 양식 핸들을 잡아 내고 wm 메시지를 처리하는 것입니다.

답변

0

마지막으로 나는 내 필요에 맞는 솔루션을 발견했습니다.

http://msdn.microsoft.com/en-us/library/system.windows.forms.nativewindow.createhandle.aspx

이 날 "고스트 창"을 만들어 내 클래스를 수정하거나 생성자 또는 속성에 핸들러를 통과하지 않고 런타임에서의 핸들러를 얻을 수 있습니다.

WM의 처리가 필요한 다른 문제도이 문제를 해결합니다.

WM 및 양식 처리기는 인터페이스를 호스팅하는 양식이 아니라 "고스트 창"임을 유의하십시오.

2

'양식 처리'(양식 개체 자체 또는 Form.Handle 속성)에 대해 무엇을 의미하는지 명확하지 않습니다.

그러나, 당신은 열려있는 모든 형태의 루프에 My.Application.OpenForms에게 수집 (see here)을 사용하고

Private Function GetFormByTitle(title as String) as Form 
    Dim result As Form 
    For Each f As Form In My.Application.OpenForms 
     if f.Text = title then 
      result = f 
      Exit For 
     End If 
    Next 
    Return result 
End Function 

그런 다음 결과를 사용할 수의 제목이나 이름을 알 필요 하나를 찾을 수 확인 된 양식의 '핸들'을 가져 오는이 방법을 사용하십시오.

Dim h as IntPtr 
Dim f as Form 

f = GetFormByTitle("Caption_Of_Form") 
if f IsNot Nothing then 
    h = f.Handle 
    ' .... do your work with handle here 
End if 
+0

+1 : [NUnitForms] (http://nunitforms.sourceforge.net/) 프로젝트는 이름이나 제목으로 양식에 액세스 할 수 있도록 귀하가 말한 것을 사용합니다. 오픈 소스이기 때문에 거기에서 코드를 얻을 수 있습니다. –

+0

아니요, 양식 핸들을 전달해야합니다. "Me.Handle"Thats는 나중에 Windows 메시지를 수신 할 수있는 양식의 내부 식별자를 호스트합니다. (운영 체제의 내부 메시지). 예 : http://msdn.microsoft.com/en-us/library/system.windows.forms.control.handle.aspx 그러나 컨트롤을위한 것이지만 동일한 원리입니다. –

+0

@SeinOxygen 그러면 위의 메서드에서 결과를 잡고 그 핸들을 사용하십시오. 업데이트 된 답변보기 – Steve

관련 문제