Skip to main content
  1. Posts/
  2. blog.dsinf.net/

Okienko zawsze na wierzchu w C#

·193 words·1 min
blog.dsinf.net c++ win c#
Daniel Skowroński
Author
Daniel Skowroński

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);