C# Winform在win10里弹出无焦点的窗口

  1. 云栖社区>
  2. 博客>
  3. 正文

C# Winform在win10里弹出无焦点的窗口

杰克.陈 2018-11-02 23:58:00 浏览1008
展开阅读全文
原文: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;
            }
        }



网友评论

登录后评论
0/500
评论
杰克.陈
+ 关注