我使用一个窗体来显示通知(它出现在屏幕的右下角),但是当我显示这个窗体时,它会抢占主窗体的焦点。有没有办法在不抢占焦点的情况下显示这个“通知”表单?
发布于 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;
}
}
发布于 2008-10-01 03:39:40
从PInvoke.net的ShowWindow方法中窃取:
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回答说,我只是通过直接粘贴代码来扩展它。有编辑权限的人可以将它复制到那里并删除它,这与我无关;) )
发布于 2008-10-01 03:08:54
如果您愿意使用Win32 P/Invoke,那么可以使用ShowWindow方法(第一个代码样例完全符合您的要求)。
https://stackoverflow.com/questions/156046
复制相似问题