让顶层窗体不无激活但能正常使用

 

 

http://blog.csdn.net/thirdapple/article/details/2755684

附件 http://files.cnblogs.com/xe2011/CSharpWinForm_WM_NCACTIVATE.rar

image

这个效果就像 你单击Combobox 下拉按钮或者菜单 主窗体不会失去焦点一样

 

Form1

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;



namespace WindowsFormsApplication1

{

    public partial class Form1 : Form

    {

        public Form1()

        {

            InitializeComponent();

        }



        private void button1_Click(object sender, EventArgs e)

        {

            Form2 f = new Form2();

            f.TopMost = true;

            f.Show();

        }

    }

}

 

Form2

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Linq;

using System.Text;

using System.Windows.Forms;



namespace WindowsFormsApplication1

{

    public partial class Form2 : Form

    {

        public Form2()

        {

            InitializeComponent();

        }





        [System.Runtime.InteropServices.DllImport("user32.dll")]

        private extern static IntPtr SetActiveWindow(IntPtr handle);

        private const int WM_ACTIVATE = 0x006;

        private const int WM_ACTIVATEAPP = 0x01C;

        private const int WM_NCACTIVATE = 0x086;

        private const int WA_INACTIVE = 0;

        private const int WM_MOUSEACTIVATE = 0x21;

        private const int MA_NOACTIVATE = 3;

        protected override void WndProc(ref Message m)

        {

            if (m.Msg == WM_MOUSEACTIVATE)

            {

                m.Result = new IntPtr(MA_NOACTIVATE);

                return;

            }

            else if (m.Msg == WM_NCACTIVATE)

            {

                

                if (((int)m.WParam & 0xFFFF) != WA_INACTIVE)

                {

                    if (m.LParam != IntPtr.Zero)

                        SetActiveWindow(m.LParam);

                    else

                        SetActiveWindow(IntPtr.Zero);

                    return;

                }

               

            }

            base.WndProc(ref m);

        }



    }

}

你可能感兴趣的:(使用)