【发布时间】:2011-05-23 19:58:23
【问题描述】:
当满足某些条件时(我的应用知道),我的应用需要在任何活动应用的光标位置附近显示一个弹出窗口。
所以我想显示表单(不从活动应用程序中窃取焦点)。我尝试使用带有 SW_SHOWNOACTIVATE 参数的 ShowWindow,但是这样,我的表单会显示在当前活动的表单下。
如何强制我的表单显示在屏幕上任何活动表单的顶部而不窃取输入焦点?
谢谢。
【问题讨论】:
当满足某些条件时(我的应用知道),我的应用需要在任何活动应用的光标位置附近显示一个弹出窗口。
所以我想显示表单(不从活动应用程序中窃取焦点)。我尝试使用带有 SW_SHOWNOACTIVATE 参数的 ShowWindow,但是这样,我的表单会显示在当前活动的表单下。
如何强制我的表单显示在屏幕上任何活动表单的顶部而不窃取输入焦点?
谢谢。
【问题讨论】:
您想要的是使用您想要保持在顶部的表单的TopMost 属性。
【讨论】:
您需要在弹出表单中添加一些管道,以便您可以覆盖 WM_ACTIVATE 消息:
protected override void WndProc(ref Message m)
{
if (m.Msg == WM_ACTIVATE)
{
if (((int)m.WParam & 0xFFFF) != WA_INACTIVE)
{
if (m.LParam != IntPtr.Zero)
{
SetActiveWindow(m.LParam);
}
else
{
// Could not find sender, just in-activate it.
SetActiveWindow(IntPtr.Zero);
}
}
}
base.WndProc(ref m);
}
确保您也将以下内容添加到弹出表单中:
[DllImport("user32.dll")]
private extern static IntPtr SetActiveWindow(IntPtr handle);
private const int WM_ACTIVATE = 6;
private const int WA_INACTIVE = 0;
您可以像使用其他任何方式一样使用弹出式表单,方法是在其上调用 Show()。与其他窗体一样,您可以通过 TopMost 属性使其成为最顶层的窗口。
【讨论】: