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

C# Winform在win10裡彈出無焦點的視窗

原文: C# Winform在win10裡彈出無焦點的視窗

有個專案需要在右下角彈出廣告視窗,但是又不能影響使用者的使用,視窗不能有焦點。

在網上搜了一堆,都是以下的程式碼,在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;
            }
        }