|
■No92890 (dorago さん) に返信 > このownerはIWin32Windowインタフェースを実装していればよく、 > 例えばコントロールをownerにしてもいいわけですが、 極端な話、.NET で管理されていないウィンドウでも構いません。 「メモ帳」や「電卓」のウィンドウを owner とすることもできます。
> 例えばコントロールをownerにしてもいいわけですが、 > フォームのOwnerプロパティはFormなので、ownerがFormではない場合、 > OwnerプロパティはNothingを返します。
――あれ? 通常は TextBox 等を渡したからといって、Nothing にはならないような。
非 Control な IWin32Window を対象としていたり、フォームに貼る前のコントロールを Owner に引き渡した場合には、Nothing になりえますが…。
Owner が Control である場合は、その Control の FindForm() メソッドの戻り値 (正確には、SetTopLevel(True) な Control までの再帰 Parent 呼び出し)が フォームの Owner プロパティに渡されるようになっていたはず。
> この場合、表示フォームのownerのWindowハンドルを知りたいのですが、 > 方法はありますか?
リフレクションしか無さそう。
Imports System.Reflection Imports System.Runtime.CompilerServices Public Module FormExtension <Extension> _ Public Function GetOwnerHandle(this As Form) As IWin32Window Static key As Integer = CInt(GetType(Form).GetField("PropDialogOwner", BindingFlags.NonPublic Or BindingFlags.Static).GetValue(Nothing)) Static ps As Func(Of Form, Object) = AddressOf GetType(Control).GetProperty("Properties", BindingFlags.NonPublic Or BindingFlags.Instance).GetValue Try Return DirectCast(CallByName(ps(this), "GetObject", CallType.Method, key), IWin32Window) Catch Return Nothing End Try End Function End Module
|