Menu Zamknij

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 user32.dll odpowiedzialnej za obsługę UI i przejęcie funkcji zmieniającej pozycję okna. Brzmi skomplikowanie. Ale implementacja jest prosta, bezbolesna i nie wymaga SafeMode:
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);

Dodaj komentarz