首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >显示窗体而不抢占焦点?

显示窗体而不抢占焦点?
EN

Stack Overflow用户
提问于 2008-10-01 10:49:26
回答 17查看 77.6K关注 0票数 152

我使用一个窗体来显示通知(它出现在屏幕的右下角),但是当我显示这个窗体时,它会抢占主窗体的焦点。有没有办法在不抢占焦点的情况下显示这个“通知”表单?

EN

回答 17

Stack Overflow用户

回答已采纳

发布于 2008-10-01 14:21:19

嗯,仅仅覆盖Form.ShowWithoutActivation还不够吗?

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

如果您也不希望用户单击此通知窗口,则可以覆盖CreateParams:

protected override CreateParams CreateParams
{
  get
  {
    CreateParams baseParams = base.CreateParams;

    const int WS_EX_NOACTIVATE = 0x08000000;
    const int WS_EX_TOOLWINDOW = 0x00000080;
    baseParams.ExStyle |= ( int )( WS_EX_NOACTIVATE | WS_EX_TOOLWINDOW );

    return baseParams;
  }
}
票数 176
EN

Stack Overflow用户

发布于 2008-10-01 03:39:40

PInvoke.netShowWindow方法中窃取:

private const int SW_SHOWNOACTIVATE = 4;
private const int HWND_TOPMOST = -1;
private const uint SWP_NOACTIVATE = 0x0010;

[DllImport("user32.dll", EntryPoint = "SetWindowPos")]
static extern bool SetWindowPos(
     int hWnd,             // Window handle
     int hWndInsertAfter,  // Placement-order handle
     int X,                // Horizontal position
     int Y,                // Vertical position
     int cx,               // Width
     int cy,               // Height
     uint uFlags);         // Window positioning flags

[DllImport("user32.dll")]
static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

static void ShowInactiveTopmost(Form frm)
{
     ShowWindow(frm.Handle, SW_SHOWNOACTIVATE);
     SetWindowPos(frm.Handle.ToInt32(), HWND_TOPMOST,
     frm.Left, frm.Top, frm.Width, frm.Height,
     SWP_NOACTIVATE);
}

(Alex Lyman回答说,我只是通过直接粘贴代码来扩展它。有编辑权限的人可以将它复制到那里并删除它,这与我无关;) )

票数 73
EN

Stack Overflow用户

发布于 2008-10-01 03:08:54

如果您愿意使用Win32 P/Invoke,那么可以使用ShowWindow方法(第一个代码样例完全符合您的要求)。

票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/156046

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档