• Программинг

Нужны источники бесперебойного питания?

Источники бесперебойного питания от дизельстор

C# показываем окно в фоне

В C# существует ограничение на задание режима показа окна. В Visual Studio в свойстве формы TopMost можно установить только два значения. При этом форма при появлении будет всегда активна. Т.е. переведет на себя фокус ввода. Например, такая ситуация: приложение «висит» в трее и показывает всплывающие окна, типа таких, которые показывает ICQ при получении сообщения. Если пользоваться стандартными возможностями .NET, то реализовать окно, которые не будет перехватывать фокус ввода, не получится. На помощь приходят старые знакомые функции WINAPI, которые выполняются с параметрами SW_SHOWNOACTIVATE и SWP_NOACTIVATE.

Теперь создайте новую форму и пропишите следующий код:

1 //подключаем возможность использовать WinApi-функции
2 using System.Runtime.InteropServices;
3 ...
4 //задаем константы
5 private const int SW_SHOWNOACTIVATE = 4; //неактивна
6 private const int HWND_TOPMOST = -1; //поверх всех окон, включая топовые
7 private const uint SWP_NOACTIVATE = 0x0010;
8  
9 //функция winapi показывает окно
10 [DllImport("user32.dll")]
11 static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
12  
13 //функция winapi показывает окно
14 [DllImport("user32.dll", EntryPoint = "SetWindowPos")]
15 static extern bool SetWindowPos(int hWnd, int hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);      
16  
17 public void ShowWindow()
18 {
19     ShowWindow(Handle, SW_SHOWNOACTIVATE);
20     SetWindowPos(Handle.ToInt32(), HWND_TOPMOST, Left, Top, Width, Height, SWP_NOACTIVATE);
21 }

Этого достаточно, чтобы создать окно, которое будет поверх всех остальных окон, но не будет активно.
Вызывать нашу форму можно так (где frmTip – это название нашей формы, которую будем показывать):

1 frmTip frm = new frmTip();
2 frm.ShowWindow();