// Создание экземпляра класса оболочки путем ссылки на библиотеку COM «Элементы управления и автоматизация Microsoft Shell» -shell32.dll
Shell32.ShellClass objShell = new Shell32.ShellClass();
//Show Desktop
((Shell32.IShellDispatch4)objShell).ToggleDesktop();
Изменить: , чтобы показать ваше приложение (Активировать или развернуть/ Restore) после переключения на самом деле оказалось довольно сложно:
Я пытался:
Application.DoEvents();
System.Threading.Thread.Sleep(5000);
Даже переопределить WndProc не удалось захватить событие:
private const Int32 WM_SYSCOMMAND = 0x112;
private const Int32 SC_MINIMIZE = 0xf020;
protected override void WndProc(ref Message m)
{
if (m.Msg == WM_SYSCOMMAND)
{
if (m.WParam.ToInt32() == SC_MINIMIZE)
return;
}
base.WndProc(ref m);
}
Поэтому я предлагаю вместо сворачивания всех других окон просто поставить свое верхнее во время операции, а затем, как только вы закончите, выключите Always On Top:
[DllImport("user32.dll")]
static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);
static readonly IntPtr HWND_TOPMOST = new IntPtr(-1);
const UInt32 SWP_NOSIZE = 0x0001;
const UInt32 SWP_NOMOVE = 0x0002;
const UInt32 TOPMOST_FLAGS = SWP_NOMOVE | SWP_NOSIZE;
public static void MakeTopMost (IntPtr hWnd)
{
SetWindowPos(hWnd, HWND_TOPMOST, 0, 0, 0, 0, TOPMOST_FLAGS);
}