私のアプリケーションは vb6 実行可能ファイルですが、システム内の一部の新しいフォームは C# で記述されています。メイン アプリケーション ウィンドウへのハンドルを使用して C# フォームの Owner プロパティを設定できるようにしたいと考えています。これにより、アプリと他のアプリの間でタブを行ったり来たりしてもダイアログが上部に表示されたままになります。
メイン アプリケーション ウィンドウの hwnd を取得できます。そこから何ができるかわかりませんか?
更新 2008 年 10 月 20 日 17:06:
スコット、
返信ありがとうございます。Show/ShowDialog メソッド パラメータが Form 型ではないことを見逃していました。Owner プロパティだけを見ていました。
上記から使用しているコードを少し変更しました。フォームを一般的にロードして ShowDialog を呼び出すコンポーネントがあります。私のコードは次のようになります。
Form launchTarget = FormFactory.GetForm(xxx); // psuedo-code for generic form loader
launchTarget.StartPosition = FormStartPosition.CenterParent;
IWin32Window parentWindow = GetWindowFromHwnd(hwnd);
launchTarget.ShowDialog(parentWindow);
GetWindowFromHwnd
あなたのコードのメソッドラップバージョンです:
private IWin32Window GetWindowFromHost(int hwnd)
{
IWin32Window window = null;
IntPtr handle = new IntPtr(hwnd);
try
{
NativeWindow nativeWindow = new NativeWindow();
nativeWindow.AssignHandle(handle);
window = nativeWindow;
}
finally
{
handle = IntPtr.Zero;
}
return window;
}
残念ながら、これは私が望んでいたことをしていません。フォームはモーダルに表示されますが、正しい位置に表示されず、タブを離して親ウィンドウに戻ってもまだ上に表示されません。私たちのモーダルはタスクバーにタスクを表示しないため、ウィンドウは「消える」ように見えます (ただし、alt-tab ウィンドウ リストにはまだ存在します)。それは、私が正しい hwnd を持っていない可能性があることを示しています。他に提案がある場合は、返信してください。再度、感謝します。
UPDATE 10 11月. 082008-11-10 16:25:00
フォローアップの 1 つのコメント - Scott の 2 番目の投稿のように、try/finally のメソッド呼び出しに分解すると、finally ブロックの呼び出しは次のようになります。
parentWindow.ReleaseHandle();