winforms - 如何在 Winforms 中制作 "popup"(提示、下拉、弹出)窗口?

标签 winforms winapi popup popupwindow

我怎样才能在 WinForms 中创建一个“弹出”窗口?

由于我使用了我自己编造的词“popup”,让我举例说明这个所谓的“popup”窗口:

  • 工具提示窗口 (可以扩展到其父窗体的边界之外,不会出现在任务栏中,不是模态的,也不会窃取焦点):

    enter image description here
  • 弹出菜单 窗口(可以扩展到其父窗体的边界之外,不会出现在任务栏中,不是模态的,并且不会窃取焦点):

    enter image description here
  • 下拉窗口(可以扩展到其父窗体的边界之外,不会出现在任务栏中,不是模态的,也不会窃取焦点):

    enter image description here
  • A 主菜单 窗口(可以扩展到其父窗体的边界之外,不会出现在任务栏中,不是模态的,并且不会窃取焦点):

    enter image description here
  • 更新 A 弹出 window 不是自己制作的the "active" window当使用鼠标或键盘进行交互时(“所有者”窗口仍然是事件窗口):

  • enter image description here

    我在这个神话般的“弹出窗口”中寻找的属性是:
  • 可以 延长 在其父表单的边界之外(即 is not a child window )
  • 没有出现在 中任务栏 (即 Window 对哪些窗口应该出现的启发式没有启动,也没有 WS_EX_APPWINDOW 扩展窗口样式)
  • 不是 模态 (即 doesn't disable its "owner")
  • 不偷焦点
  • 总是 置顶 它的“所有者”
  • 与(所有者保持事件状态)交互时不会成为“事件”窗口

  • Windows 应用程序已经在设法创建这样的窗口。我如何在 WinForms 应用程序中做到这一点?

    相关问题
  • 我如何在 native 代码中实现上述所有内容?
  • 如何在 Delphi 中创建一个弹出窗口?
  • 我有这个 native 代码来显示一个“弹出”窗口 - 在 .NET 中执行相同的操作需要什么 P/Invokes?
  • 我在 .NET 中有一组 P/Invoke - 我可以重用常规的 WinForm,覆盖某些方法来达到相同的效果吗?
  • 我通过覆盖某些方法将 WinForm 显示为“弹出窗口” - 是否有内置的 Control那可以作为我的弹出窗口吗?
  • How to simulate a drop-down window in WinForms?


  • 尝试#1

    我试过 Show(onwer) + ShowWithoutActivation方法:
    PopupForm dd = new PopupForm ();
    dd.Show(this);
    

    使用 PopupForm:
    public class PopupForm: Form
    {
        public PopupForm()
        {
            InitilizeComponent();
        }
    
        private void InitilizeComponent()
        {
            this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
            this.WindowState = FormWindowState.Normal;
            this.ShowInTaskbar = false;
        }
    
        protected override bool ShowWithoutActivation
        { get { return true; } }
    }
    

    几乎解决了这个问题,但后来我发现提醒了“弹出”窗口的另一个属性:当通过鼠标或键盘进行交互时,它们不会从“所有者”表单中获取焦点。

    最佳答案

    你想要一个拥有的 window 。在您的主要形式中:

    private void showPopup_Click(object sender, EventArgs e)
    {
        PopupForm popupForm = new PopupForm();
        // Make "this" the owner of form2
        popupForm.Show(this);
    }
    

    PopupForm 应如下所示:
    public partial class PopupForm : Form
    {
        private bool _activating = false;
    
        public PopupForm()
        {
            InitializeComponent();
        }
    
        // Ensure the popup isn't activated when it is first shown
        protected override bool ShowWithoutActivation
        {
            get
            {
                return true;
            }
        }
    
        private const int WM_NCACTIVATE = 0x86;
    
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        public static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam);
    
        protected override void WndProc(ref Message m)
        {
            // The popup needs to be activated for the user to interact with it,
            // but we want to keep the owner window's appearance the same.
            if ((m.Msg == WM_NCACTIVATE) && !_activating && (m.WParam != IntPtr.Zero))
            {
                // The popup is being activated, ensure parent keeps activated appearance
                _activating = true;
                SendMessage(this.Owner.Handle, WM_NCACTIVATE, (IntPtr) 1, IntPtr.Zero);
                _activating = false;
                // Call base.WndProc here if you want the appearance of the popup to change
            }
            else
            {
                base.WndProc(ref m);
            }
        }
    }
    

    并确保 PopupForm.ShowInTaskbar = false .

    关于winforms - 如何在 Winforms 中制作 "popup"(提示、下拉、弹出)窗口?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8669368/

    相关文章:

    c# - 如何确定按下的键是下划线还是减号? C#

    c# - 按钮双击事件

    c++ - DuplicateHandle(),在第一个或第二个过程中使用?

    .net - 显示 MenuItem 的工具提示

    c++ - 将窗口内容显示为位图

    java - JNA 中的 Oleacc dll 支持

    javascript - 如何防止 Google Chrome 阻止我的弹出窗口?

    java - PopupWindow 与 ActionBar 重叠

    javascript - jQuery 对齐 - 相对于浏览器窗口?

    c# - 'xx' 由于其保护级别而无法访问