BringToFront() in C#

本文关键字:in BringToFront | 更新日期: 2023-09-27 17:58:54

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

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

我如何确保每当我需要看到我的表单时,它总是显示在任何其他内容的顶部?

BringToFront() in C#

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

应适用于所有应用程序,包括全屏独占游戏(在我的所有游戏上测试,到目前为止,它都有效)。

您可以尝试将通知表单的TopMost属性设置为true。。。或者通过调用CCD_ 5而不是CCD_。

我很难处理同一主题,尤其是在Outlook中单击自定义协议的"链接"时。(应用程序捕捉到了它,但总是在后台…)

尽管许多解决方案在调试时都有效,但对于"实时部署",似乎只有以下调用链才能达到预期效果:

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

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

几乎每次都有效。

这里是调用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;
}

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

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

您可以尝试设置TopLevel=true,这样可以推进控制。TopMost=true可以防止任何其他传染病引起关注,而这并不总是你想要的。

使用.NET 7仅使用即可工作

this.Activate()