BringToFront () in C#

у меня есть приложение, которое я сделал для клиента, но иногда он не знает, прибыл ли заказ, потому что он играет в World of Warcraft с максимальным объемом. Но он сказал, что хочет, чтобы мое маленькое окно уведомлений появилось на вершине его игры, если придет новый заказ.

Итак, я думал, что могу просто использовать BringToFront(); который, кажется, работает, когда полноэкранные приложения максимальны. Но, я заметил, что во время игры V8 Supercars в полноэкранном режиме, BringToFront(); не приносит уведомление окно на вершине игры, поэтому я считаю, что некоторые игры имеют другой способ убедиться, что они остаются на вершине всего остального.

Как я могу убедиться, что всякий раз, когда мне нужно, чтобы моя форма была видна, она всегда будет отображаться на вершине что-нибудь другое?

6 ответов


вы можете попробовать установить форму уведомления TopMost свойство true...или сделайте его модальным, позвонив .ShowDialog вместо .Show.


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

должны работать с все приложения, полноэкранные эксклюзивные игры включены (протестированы на всех моих играх, до сих пор он работает).


вот код 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;
}

по умолчанию он будет отображаться в верхней части экрана, но это не модель .

можно использовать Window.Show() метод insted закрытия окна изменить его видимость на False, когда это не требуется. Возможно, вам придется играть с родительским свойством дочерних окон, установите его в Главное окно


Я боролся с той же темой, особенно когда в Outlook была нажата "ссылка" на пользовательский протокол. (Приложение поймало его, но всегда в фоновом режиме...)

несмотря на то, что многие решения работали во время отладки, для "живого развертывания" только следующая цепочка вызовов, похоже, достигает желаемого:

(вызывается, обработка ссылок происходит из потока)

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

работает каждый раз.


Show () эквивалентно для установки Visible = true. он не изменяет Z-порядок элемента управления. Если элемент управления закрыт каким-либо другим элементом управления, который находится перед Z-порядком, пользователь все равно не сможет увидеть ваш элемент управления.

BringToFront() изменяет Z-порядок элемента управления (выводит на передний план), но не изменяет его видимость. Если контроль скрыт, он останется скрытым. Но когда вы сделаете свой контроль видимым, он появится на перед всеми другими элементами управления.

же скрыть() (делает управление невидимым, но не изменяет Z-порядок) и SendToBack (не изменяет видимость, но возвращает управление назад).

enter image description here

enter image description here