winforms C#中的BringToFront()

qgzx9mmu  于 2023-04-21  发布在  C#
关注(0)|答案(7)|浏览(233)

我这里有一个我为一个客户做的应用程序,但有时他不知道订单是否已经到达,因为他玩魔兽世界的音量最大了。但他说他希望我的小通知窗口出现在他的游戏顶部,如果新订单到达。
所以,我想我可以只使用BringToFront();,这似乎工作时,全屏应用程序最大化.但是,我注意到,当玩V8超级跑车在全屏,BringToFront();不带来通知窗口在游戏之上,所以我认为,一些游戏有另一种方式,以确保他们保持在其他一切之上.
我怎样才能确保每当我需要看到我的表单时,它总是显示在其他任何东西的顶部?

sigwle7e

sigwle7e1#

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

应该与 * 所有 * 应用程序,包括全屏独家游戏(在我所有的游戏测试,到目前为止,它的作品)。

j7dteeu8

j7dteeu82#

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

ar7v8xwq

ar7v8xwq3#

我在同一个主题上挣扎,尤其是当在Outlook中点击一个指向自定义协议的“链接”时。(应用程序抓住了它,但总是在后台...)
尽管很多解决方案在调试时都能工作,但对于“实时部署”,只有以下调用链似乎可以实现所需的功能:
(调用,导致从线程处理链接)

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

每次都有效。

yyhrrdl8

yyhrrdl84#

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

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;
}
dohp0rv5

dohp0rv55#

默认情况下,它将显示在屏幕顶部,但它不是模型。
你可以使用Window.Show()方法代替关闭窗口,在不需要时将其可见性更改为False。你可能需要使用子窗口的Parent属性将其设置为主窗口

aemubtdh

aemubtdh6#

您可以尝试设置TopLevel = true,这会使控件向前移动。TopMost = true会阻止任何其他控件获得焦点,这并不总是您想要的。

plupiseo

plupiseo7#

使用.NET 7时,仅使用

this.Activate()

相关问题