代码之家  ›  专栏  ›  技术社区  ›  robinjam

如何在c_中创建“不可聚焦”窗体?

  •  12
  • robinjam  · 技术社区  · 15 年前

    我想用C创建一个不能接受焦点的表单,即当我单击表单上的按钮时,焦点不会从当前具有焦点的应用程序中被盗。

    请参阅Windows屏幕键盘以了解此示例。请注意,单击某个按钮时,焦点不会从当前使用的应用程序中转移。

    如何实现这种行为?

    更新:

    事实证明,它和重写 CreateParams 属性和添加 WS_EX_NOACTIVATE 扩展窗口样式。谢谢你指点我的方向!

    不幸的是,这有一个不受欢迎的副作用,它会干扰窗体的移动,也就是说,您仍然可以在屏幕周围拖放窗体,但拖动时窗口的边框不会显示,因此很难精确定位窗体。

    如果有人知道如何解决这个问题,我们将不胜感激。

    1 回复  |  直到 15 年前
        1
  •  9
  •   max    15 年前

    class NonFocusableForm : Form
    {
        protected override void DefWndProc(ref Message m)
        {
            const int WM_MOUSEACTIVATE = 0x21;
            const int MA_NOACTIVATE = 0x0003;
    
            switch(m.Msg)
            {
                case WM_MOUSEACTIVATE:
                    m.Result = (IntPtr)MA_NOACTIVATE;
                    return;
            }
            base.DefWndProc(ref m);
        }
    }
    

        [DllImport("user32.dll")]
        public static extern bool ShowWindow(IntPtr handle, int flags);
    
        NativeMethods.ShowWindow(form.Handle, 8);
    

        protected override bool ShowWithoutActivation
        {
            get { return true; }
        }