Okienko zawsze na wierzchu w C#
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);