我的應用程序是VB6的可執行文件,但系統中的一些較新的形式寫在C#。我希望能夠使用主應用程序窗口的句柄來設置C#窗體的Owner屬性,以便在我的應用程序和其他應用程序之間來回切換時,對話框保持最前端。我可以使用hwnd/NativeWindow獲取設置WinForms窗體所有者的行爲嗎?
我能得到應用程序主窗口的HWND。我不確定我能從那裏做什麼?
UPDATE年10月20 '08在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;
}
不幸的是,這是不是在做什麼我所希望的。表單不會以模態方式顯示,但它不會顯示在正確的位置,當我退回到父窗口時,它也不會顯示在最前面。我們的模態不會在任務欄中顯示任務,因此該窗口似乎「消失」(儘管它仍存在於替代選項卡窗口列表中)。對我來說這表明我可能沒有正確的hwnd。如果您還有其他建議,請回復。再次感謝。
UPDATE 11月10日08時16:25
一個跟進的話 - 如果您因素出來到一個try /終於,在斯科特的第二後,調用一個方法調用在finally塊應該是:
parentWindow.ReleaseHandle();
斯科特 - 抱歉拖延了很長時間,被拉到其他東西。您提交的原始答案效果很好。我只需要通過ShowDialog傳入NativeWindow,而不是設置Form.Owner。我的另一個問題是調用代碼首先不能傳遞正確的hWnd。謝謝 – mcw0933 2008-10-30 20:55:38