想让一个窗口不能激活,谷歌告诉我可以用WS_EX_NOACTIVATE,但我试了好象没有用,有人知道吗?

解决方案 »

  1.   

        public const int GWL_EXSTYLE = -20;
            public const int WS_EX_NOACTIVATE = 0x8000000;        [DllImport("user32.dll")]
            public static extern int SetWindowLong(IntPtr window, int index, int value);        [DllImport("user32.dll")]
            public static extern int GetWindowLong(IntPtr window, int index);        private void Form1_Load(object sender, EventArgs e)
            {
                SetWindowLong(this.Handle, GWL_EXSTYLE, GetWindowLong(this.Handle, GWL_EXSTYLE) | WS_EX_NOACTIVATE);
            }
      

  2.   


    要看场合的,如果用在程序的唯一窗体上,的确有作用,假如窗体是由另一个窗体打开的,就没用了。比如在窗体A上有一个按钮,点击后打开具有WS_EX_NOACTIVATE样式的窗体B,这时你会发现窗体B仍旧可以获得焦点,但如果你从其它程序的窗体直接切换到窗体B,它就不能获得焦点了。
      

  3.   

    我发现ContextMenuStrip居然根本不用WS_EX_NOACTIVATE,有没有哪位达人能解释一下象ContextMenuStrip、Tooltip甚至是ComboBox下拉部分这种无法获得焦点窗体的实现原理呢?
      

  4.   


        #region 浮动工具条窗体    private const int WS_EX_TOOLWINDOW = 0x00000080;
        private const int WS_EX_NOACTIVATE = 0x08000000;
        // 浮动工具条窗体
        protected override CreateParams CreateParams
        {
          get
          {
            CreateParams cp = base.CreateParams;
            cp.ExStyle |= (WS_EX_NOACTIVATE | WS_EX_TOOLWINDOW);
            cp.Parent = IntPtr.Zero; // Keep this line only if you used UserControl
            return cp;
            //return base.CreateParams;
          }
        }    #endregion试试这样行不?
      

  5.   


    试过了,没用,cp.Parent本来就是0。
      

  6.   

          private readonly Int32 WM_SETFOCUS = 7;
            private readonly Int32 WM_ACTIVATE = 0x006;
            private readonly Int32 WM_NCACTIVATE = 0x086;        [DllImport("user32.dll", CharSet = CharSet.Auto)]
            static extern IntPtr SendMessage(IntPtr hWnd, Int32 Msg, Int32 wParam, Int32 lParam);        protected override void WndProc(ref Message m)
            {
                if (m.Msg == WM_SETFOCUS || m.Msg == WM_ACTIVATE)
                {
                    SendMessage(this.Handle, WM_NCACTIVATE, 0, 0);
                    return;
                }            base.WndProc(ref m);
            }        private void Form1_Shown(object sender, EventArgs e)
            {
                SendMessage(this.Handle, WM_NCACTIVATE, 0, 0);
            }
      

  7.   

    我也正好在看WM_NCACTIVATE,看来这是个不错的主意,不过还有很多细节要处理,any way,谢谢了!