フォームハンドルを必要とするクラスを作成していますが、クラスコンストラクターまたはプロパティで引数として送信せずに使用する方法はありますか?
フォームが完全に読み込まれるまでハンドラーが設定されないことはわかっているので、これも別の問題です。
基本的な考え方は、引数として渡さずにフォームハンドルをキャッチし、wmメッセージを処理することです。
'Form Handle'(フォームオブジェクト自体またはForm.Handleプロパティ?)の意味が明確ではありません。
ただし、My.Application.OpenFormsコレクション(ここを参照)を使用して、開いているすべてのフォームをループし、タイトルまたは名前を知っている必要のあるフォームを見つけることができます。
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
最後に、自分のニーズに合ったソリューションを見つけました。
http://msdn.microsoft.com/en-us/library/system.windows.forms.nativewindow.createhandle.aspx
これにより、クラスを変更したり、コンストラクターやプロパティでハンドラーを渡したりすることなく、「ゴーストウィンドウ」を作成し、ランタイムでそのハンドラーを取得できます。
必要だった他のことはWMを処理することでした、そしてこれは問題も解決します。
WMとフォームハンドラーは「ゴーストウィンドウ」であり、インターフェイスをホストするフォームではないことに注意してください。