0

フォームを作成して別のアプリのウィンドウの前にスタックする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());
        }
    }

これら2つのサンプルの違いは何ですか?1つ目は正常に機能しており、2つ目は現在のウィンドウをフリーズしています。

4

1 に答える 1

1

先ほど述べたように、フォーム用のメッセージ ポンプを作成する必要があります。試す

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

次に、フォームの親を設定できるはずです。

詳細については、こちらを参照してください。

于 2013-02-20T09:32:47.757 に答える