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); }
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);
}
要看场合的,如果用在程序的唯一窗体上,的确有作用,假如窗体是由另一个窗体打开的,就没用了。比如在窗体A上有一个按钮,点击后打开具有WS_EX_NOACTIVATE样式的窗体B,这时你会发现窗体B仍旧可以获得焦点,但如果你从其它程序的窗体直接切换到窗体B,它就不能获得焦点了。
#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试试这样行不?
试过了,没用,cp.Parent本来就是0。
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);
}