Microsoft zawsze raczył nas dziwnymi rozwiązaniami prostych spraw. Problem częsty przy małych aplikacjach w C#, które mają być zawsze na wierzchu – stoperach, minutnikach, czy monitorach wydajności – jak uczynić okno pozostającym zawsze na wierzchu. Na MSDNie zaproponowano rozwiązanie, które znaleźć możemy jako Property kontrolki WindowsForm:
this.TopForm = true;
Jednak jak można doczytać od Windowsa 2000 ta zmiana dotyczy zakresu danej aplikacji – znaczy to, że jeśli pracujemy z wielookienkowym narzędziem to możemy podpiąć jakiś toolbar, żeby nie zniknął. Ale utrata przez proces focusa na okno przerzuci je w tło.
Rozwiązanie skuteczne wymaga załadowania biblioteki
W nagłówku dopisujemy
using System.Runtime.InteropServices;
W klasie naszego projektu
private IntPtr HWND_TOPMOST = new IntPtr(-1); private const uint SWP_NOSIZE = 0x0001; private const uint SWP_NOMOVE = 0x0002; private const uint TOPMOST_FLAGS = SWP_NOMOVE | SWP_NOSIZE; [DllImport("user32.dll")] public static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);
I samo wywołanie w dowolnym miejscu, np. podczas ładowania w konstruktorze (np. public form1(){} ):
SetWindowPos(this.Handle, HWND_TOPMOST, 0, 0, 0, 0, TOPMOST_FLAGS);