我需要Form2始终位于每个窗口的顶部 - 包括全屏游戏。这总是适用于窗口模式应用程序,但有时当另一个应用程序处于全屏模式时它不会出现在最顶端。 (游戏,OpenGL,直接)
我该如何解决这个问题?
Form1中:
Overlay overlayui = new Overlay();
overlayui.TopMost = true; // I have tried setting TopMost to false, same result.
overlayui.Show();
窗体2:
WinForms设计视图中的设置:
FormBorderStyle = none
ControlBox = false
ShowIcon = false
ShowInTaskBar = false
TopMost = false
我已经实现了在类似问题中使用的这段代码:
[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);
static readonly IntPtr HWND_TOPMOST = new IntPtr(-1);
const UInt32 SWP_NOSIZE = 0x0001;
const UInt32 SWP_NOMOVE = 0x0002;
const UInt32 SWP_SHOWWINDOW = 0x0040;
public Overlay()
{
InitializeComponent();
this.Bounds = Screen.PrimaryScreen.Bounds;
}
然后我实现了一个计时器(间隔10毫秒):
private void timer1_Tick(object sender, EventArgs e)
{
SetWindowPos(this.Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_SHOWWINDOW);
}
internal class MessagesFilter : IMessageFilter
{
private readonly IntPtr ControlHandler;
private const int WM_KEYUP = 0x0101;
public MessagesFilter(IntPtr ControlHandler)
{
this.ControlHandler = ControlHandler;
}
#region IMessageFilter Members
public bool PreFilterMessage(ref Message m)
{
// TODO: Add MessagesFilter.PreFilterMessage implementation
if (m.Msg == WM_KEYUP)
{
if (m.HWnd == ControlHandler)
{
Keys k = ((Keys)((int)m.WParam));
if (k == Keys.Enter)
return true;
}
}
return false;
}
#endregion
}
编辑:
我已经实施了新的计时器:
SetWindowPos(processNOtopmost, HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE )
因此,第一次使我的应用程序占据首位,第二次从最顶层的外部应用程序中删除。 还是同样的问题,有时它有效,有时候它没有。
答案 0 :(得分:1)
您想要设置:
TopMost = true
据我所知,虽然这只会使它成为应用程序的最顶层窗口。 您无法控制其他应用程序,除非您完全防止失去焦点(不建议) 此外,大多数应用程序都是“偷窃”。您将关注DirectX并优先考虑GPU。