使用SetParent冻结父窗口

本文关键字:窗口 冻结 SetParent 使用 | 更新日期: 2023-09-27 18:00:18

我在C#中有一个应用程序,它创建一个表单并将其堆叠在另一个应用的窗口前。我使用SetParent来完成此操作。但是,(新的)父窗口会冻结。

我该如何解决?这是线程问题吗?

这是有效的:

private void Test(object sender, EventArgs e)
        {
            FormCover cov = new FormCover();
            IntPtr hwnd = Win32Utils.FindWindowByCaptionStart(IntPtr.Zero, TrackerName, null);
            Win32Utils.SetParent(cov.Handle, hwnd);
            cov.SetDesktopLocation(0, 0);
            cov.Show();
        }

但这(带有计时器超时事件)是而不是

public partial class Form1 : Form
    {
FormCover cover;
void tmrCheck_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            ShowCover();
        }
private void ShowCover()
        {
            cover = new FormCover();
            IntPtr hwnd = Win32Utils.FindWindowByCaptionStart(IntPtr.Zero, TrackerName, null);
            cover.CoverInitialize(hwnd);
            cover.Activate();
        }
}
//------
public partial class FormCover : Form
    {
        public delegate void IntPtrDlg(IntPtr param);
        public FormCover()
        {
            InitializeComponent();
        }
        internal void CoverInitialize(IntPtr hwdnParent)
        {
            if (this.InvokeRequired)
            {
                this.Invoke(new IntPtrDlg(CoverInitialize), new object[] { hwdnParent });
            }
            else
            {
                Win32Utils.SetParent(this.Handle, hwdnParent);
                this.SetDesktopLocation(0, 0);
            }
        }
        internal void CoverActivate(IntPtr handleFormulario)
        {
            if (!Visible)
                this.Show();
        }
        internal void CoverFinalize()
        {
            Hide();
            Win32ParentUtils.SetParent(Handle, new IntPtr());
        }
    }

这两个样品有什么区别?第一个正在正常工作,第二个正在冻结窗户。

使用SetParent冻结父窗口

正如我刚才所说,您需要为表单创建一个消息泵。尝试

Thread thread = new Thread( () =>
{
     var formCover = new FormCover();
     Application.Run(formCover);
});
thread.ApartmentState = ApartmentState.STA;
thread.Start();

然后你应该能够设置你的窗体的父级。

请参阅此处以获取进一步的参考。