【问题标题】:Set Window.Owner using hWnd使用 hWnd 设置 Window.Owner
【发布时间】:2012-11-30 08:10:40
【问题描述】:

在我的 WPF/C# 应用程序中,我正在使用如下代码创建一个对话框窗口:

Window dialog = new MyDialog() as Window;
dialog.Owner = Window.GetWindow(this);
dialog.ShowDialog();

如何将对话框所有者设置为另一个应用程序窗口的 hWnd?

我需要的功能只是在对话框可见时阻止“所有者窗口”。

【问题讨论】:

    标签: c# wpf winapi


    【解决方案1】:

    使用WindowInteropHelper:

    Window dialog = new MyDialog();
    WindowInteropHelper wih = new WindowInteropHelper(dialog);
    wih.Owner = ownerHwnd;
    dialog.ShowDialog();
    

    【讨论】:

    • 这是设置所有者的工作,但不幸的是它不会阻止用户对窗口的输入。有没有办法做到这一点?
    【解决方案2】:

    我找到了阻止“所有者窗口”的解决方案。代码的第一部分来自 Douglas 的回答,其余部分是使用对 WinAPI EnableWindow 方法的调用:

    Window dialog = new MyDialog();
    WindowInteropHelper wih = new WindowInteropHelper(dialog);
    wih.Owner = ownerHwnd;
    
    //Block input to the owner
    Windows.EnableWindow(ownerHwnd, false);
    
    EventHandler onClosed = null;
    onClosed = (object sender, EventArgs e) =>
    {
        //Re-Enable the owner window once the dialog is closed
        Windows.EnableWindow(ownerHwnd, true);
    
        (sender as Window).closed -= onClosed;
    };
    
    dialog.Closed += onClosed;
    dialog.WindowStartupLocation = WindowStartupLocation.CenterOwner;
    dialog.ShowActivated = true;
    dialog.Show();
    
    //Import the EnableWindow method
    [DllImport("user32.dll")]
    [return: MarshalAs(UnmanagedType.Bool)]
    static extern bool EnableWindow(IntPtr hWnd, bool bEnable);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-20
      • 2011-12-23
      • 1970-01-01
      • 1970-01-01
      • 2017-06-18
      • 1970-01-01
      • 2017-10-09
      • 1970-01-01
      相关资源
      最近更新 更多