1. 程式人生 > >C# Winform在win10裏彈出無焦點的窗口

C# Winform在win10裏彈出無焦點的窗口

ide href 一段 最終 影響 sdn 利用 sta eas

原文:C# Winform在win10裏彈出無焦點的窗口

版權聲明:本文為博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/wangmy1988/article/details/78617139

有個項目需要在右下角彈出廣告窗口,但是又不能影響用戶的使用,窗口不能有焦點。

在網上搜了一堆,都是以下的代碼,在form中添加一段樣式。

        protected override CreateParams CreateParams
        {
            get
            {
                const int WS_EX_NOACTIVATE = 0x08000000;
                CreateParams cp = base.CreateParams;
                cp.ExStyle |= WS_EX_NOACTIVATE;
                return cp;
            }
        }

當前用的是win10系統,怎麽嘗試都不行,沒有任何效果,依舊焦點被彈出的窗口截取了。

然後網上又找到了一段代碼,是利用系統的API,先獲取之前的激活的窗口,彈出新窗口了再重置之前窗口為激活,這樣的話還是會影響之前的操作,不夠完美。

        //引用系統API
        [DllImport("user32.dll")]
        public static extern IntPtr GetActiveWindow();

        [DllImport("user32.dll")]
        public static extern IntPtr SetActiveWindow(IntPtr hwnd);

        private AdForm mf = null;
        private void button_Click(object sender, EventArgs e)
        {           
            IntPtr activeForm = GetActiveWindow();//先得到當前的活動窗體?
            if (mf == null)
            {
                mf = new AdForm();
                mf.Show();
            }
            SetActiveWindow(activeForm); //在把焦點還給之前的活動窗體  
        }


多次嘗試後得到一個結果,必須給窗體添加WS_CHILD樣式才能生效。最終代碼如下

        protected override CreateParams CreateParams
        {
            get
            {
                const int WS_EX_NOACTIVATE = 0x08000000;
                const int WS_CHILD = 0x40000000;
                CreateParams cp = base.CreateParams;
                cp.Style |= WS_CHILD;
                cp.ExStyle |= WS_EX_NOACTIVATE;
                return cp;
            }
        }



C# Winform在win10裏彈出無焦點的窗口