を使用する場合System.Windows.Forms.ShowDialog(IWin32Window)
、任意のウィンドウ ハンドルを表すものを渡して、IWin32Window
そのウィンドウに対してモーダルにする必要がありますか?
Internet Explorer 7 拡張機能の一部として、Internet Explorer タブに関するウィンドウ モーダルを開こうとしています。現在選択されているタブではありませんが、タブの hwnd を取得できれば OK です。ただし、これを ShowDialog に渡すと、フォームが表示されますが、モーダルではありません。所有者であるはずのタブを含め、Internet Explorer で操作を行うことができます。私のフォームは Internet Explorer ウィンドウの上に浮いて表示され、一番上に表示されるので、通常のフォームとして開かれただけではなく、正しくモーダルではありません。
Spy++を使用すると、フォームを見つけることができ、その所有者ハンドルが正しく設定されています。
これは、何かが間違っているということですか、それとも私が何か間違ったことをしているということですか? フォームを正しくモーダルにするにはどうすればよいですか?
参考までに、このラッパー クラスを使用してIWin32Window
fromを作成していますhwnd
(ありがとうRyan! ):
/// <summary>
/// Wrapper class so that we can return an IWin32Window given a hwnd
/// </summary>
public class WindowWrapper : System.Windows.Forms.IWin32Window
{
public WindowWrapper(IntPtr handle)
{
_hwnd = handle;
}
public IntPtr Handle
{
get { return _hwnd; }
}
private IntPtr _hwnd;
}
更新: Internet Explorer 7 & .NET 2.0 の使用
更新: Spy++ とそれが公開するハンドルをもう少しいじってみると、別のものを使用するとhwnd
、ウィンドウをタブにモーダルにすることができることがわかりました。
Spy ++では class として表示されるIWebBrowser2.HWND dochwnd
で提案されているように、タブを使用していました。クラス の子があり、これには Internet_Explorer_Server の子があります。の を使用すると、正しく動作します。たとえば、マウスで他のタブをクリックすると、Internet Explorer は正常に反応します。興味のあるタブをマウスでクリックすると、windows d'oh サウンドが再生され、何もしません。TabWindowClass
Shell DocObject View
hwnd
Internet Explorer_Server
Internet_Explorer_Server をプログラムで取得する方法はまだわかりませんが、hwnd
可能なはずです。
また、価値のあることとして、他のウィンドウ ハンドルで遊んでいる間、通常、フォームを他のアプリケーションやダイアログに対してモーダルにすることができました。したがって、私の質問に対する答えは「すべてのハンドルではなく多くのハンドル」であると思います...おそらくアプリケーションに依存しますか?
更新: 別の補足事項: フォームをウィンドウ全体ではなくタブに対してモーダルにしたかった当初の理由は、MessageBox
フォームから a を開くときに、フォームを所有者として渡すと、MessageBox
常にフォームの上に開くとは限らないためです。 . Internet Explorer の新しいタブを開いたばかりでアクティブになっていない場合、MessageBox
タブが非表示になり、そのタブが点滅し始めます。ただし、モーダルでフォームを開いた状態で Internet Explorer が無効になっているため、そのタブに切り替えることができず、Internet Explorer がフリーズしていました。フォームモーダルをタブに開くとこれが解決すると思いましたが、別の解決策は使用を避けることであることがわかりましMessageBox
た.2番目のフォームを使用ShowDialog(this)
し、最初のフォームから2番目のフォームが正しく前面に開きます。Form.ShowDialog()
そのため、よりもうまく機能するようですMessageBox.Show()
ある場合には。モーダル ダイアログとメッセージ ボックスに関する問題 での詳細な議論。