C#中的BringToFront()

时间:2011-06-10 07:20:31

标签: c# .net winforms

我在这里为一个客户制作了一个应用程序,但有时他不知道订单是否已经到达,因为他玩量最大的魔兽世界。但他表示,如果新订单到货,他希望我的小通知窗口显示在他的游戏的顶部。

所以,我认为我可以使用BringToFront();,这似乎在全屏应用程序最大化时起作用。但是,我注意到,在全屏播放V8超级跑车的同时,BringToFront();没有将通知窗口带到游戏顶部,所以我认为有些游戏有另一种方法可以确保它们保持在其他所有位置。

如何确保每当我需要查看表单时,它总会显示在任何其他内容上?

5 个答案:

答案 0 :(得分:5)

您可以尝试将通知表单的TopMost属性设置为true ...或通过调用.ShowDialog而不是.Show将其设置为模态。

答案 1 :(得分:5)

form.TopMost = true;
form.ShowDialog();
form.BringToFront();

应该与所有应用程序一起使用,包括全屏独家游戏(在我的所有游戏中测试,到目前为止,它都有效)。

答案 2 :(得分:2)

这里调用windows API函数的VB代码应该相对容易翻译(注意,这是未经测试的,在论坛上找到,也可能出现光标问题)。

Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal _ hWndInsertAfter As Long, ByVal X As Long, ByVal Y As Long, ByVal cx As Long, _ ByVal cy As Long, ByVal wFlags As Long) As Long
Const HWND_TOPMOST = -1 
Const SWP_NOMOVE = &H2 
Const SWP_NOSIZE = &H1 
Private Sub Form_Load() 
    Call SetWindowPos(Form1.hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE Or SWP_NOSIZE) 
End Sub

创建一个间隔为1的计时器,代码如下:

Private Declare Function SetParent Lib "user32" (ByVal hWndChild As Long, ByVal hWndNewParent As Long) As Long 
Private Declare Function GetForegroundWindow Lib "user32" () As Long 
Private Sub Timer1_Timer() 
    Dim mhwnd As Long 
    mhwnd = GetForegroundWindow SetParent Form1.hwnd, mhwnd 
End Sub

下面的代码(通过自动化工具):

const long HWND_TOPMOST = -1;
const long SWP_NOMOVE = 2;
const long SWP_NOSIZE = 1;

[DllImport("user32.dll")]
private static extern long SetWindowPos(long hwnd, long hWndInsertAfter, long X, long Y, long cx, long cy, long wFlags);

private void Form_Load() {
    SetWindowPos(Form1.hwnd, HWND_TOPMOST, 0, 0, 0, 0, (SWP_NOMOVE | SWP_NOSIZE));
}

[DllImport("user32.dll")]
private static extern long SetParent(long hWndChild, long hWndNewParent);

[DllImport("user32.dll")]
private static extern long GetForegroundWindow();

private void Timer1_Timer() {
    long mhwnd;
    mhwnd = GetForegroundWindow;
    SetParent;
    Form1.hwnd;
    mhwnd;
}

答案 3 :(得分:1)

默认情况下,它会显示在屏幕顶部,但不是模型。

您可以使用关闭窗口的Window.Show()方法,在不需要时将其可见性更改为False。 您可能需要使用子窗口的Parent Property将其设置为主窗口

答案 4 :(得分:1)

我在同一主题上挣扎,特别是当一个"链接"在Outlook中单击自定义协议。 (应用程序抓住了它,但总是在后台......)

即使很多解决方案在调试时都有效,但对于" Live-Deployment"只有以下调用链似乎达到了预期目标:

(调用,导致链接处理从线程发生)

this.Invoke(new Action(() => {
  this.Activate();
  //...do stuff
  this.TopMost = true;
  this.BringToFront();
  this.TopMost = false;                              
}));

每次都有效。