0

フォームハンドルを必要とするクラスを作成していますが、クラスコンストラクターまたはプロパティで引数として送信せずに使用する方法はありますか?

フォームが完全に読み込まれるまでハンドラーが設定されないことはわかっているので、これも別の問題です。

基本的な考え方は、引数として渡さずにフォームハンドルをキャッチし、wmメッセージを処理することです。

4

2 に答える 2

2

'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
于 2012-05-03T20:57:41.557 に答える
0

最後に、自分のニーズに合ったソリューションを見つけました。

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

これにより、クラスを変更したり、コンストラクターやプロパティでハンドラーを渡したりすることなく、「ゴーストウィンドウ」を作成し、ランタイムでそのハンドラーを取得できます。

必要だった他のことはWMを処理することでした、そしてこれは問題も解決します。

WMとフォームハンドラーは「ゴーストウィンドウ」であり、インターフェイスをホストするフォームではないことに注意してください。

于 2012-05-07T01:57:28.163 に答える