首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用SetParent冻结父窗口

使用SetParent冻结父窗口
EN

Stack Overflow用户
提问于 2013-02-20 09:18:35
回答 1查看 1.6K关注 0票数 0

我在C#中有一个应用程序,它创建一个表单并将其堆叠在另一个应用程序的窗口前面。我是通过使用SetParent来做到这一点的。但是,(新的)父窗口会冻结。

我该怎么解决呢?这是线程问题吗?

这是行之有效的:

代码语言:javascript
复制
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();
        }

但是这个(带有计时器运行的事件)是而不是

代码语言:javascript
复制
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());
        }
    }

这两个样品有什么区别?第一个是工作正常,第二个是冻结前的窗口。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-02-20 09:32:47

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

代码语言:javascript
复制
Thread thread = new Thread( () =>
{
     var formCover = new FormCover();
     Application.Run(formCover);
});
thread.ApartmentState = ApartmentState.STA;
thread.Start();

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

有关更多参考,请参见这里

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14976155

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档