Если приложение выполняется в фоновом режиме, когда его
основное окно перекрыто активным приложением, то активация с помощью
Form.Activate не сильно поможет, поскольку название окна будет просто
мигать в панеле задач. Есть еще один способ с помощью средств Windows Forms активировать
окно - это использовать две строчки:
Form.TopMost = true;
Form.TopMost = false;
Единственный минус - это то, что окно не получит фокус ввода.
Ничего не остается как прибегнуть к вызову API функций. Нижеприведенная
функция активирует окно и устанавливает на нем фокус:
private void ForceActivate(Form form) {
ForceActivate(form.Handle);
}
private void ForceActivate(IntPtr handle) {
uint threadId1;
uint threadId2;
uint processId1;
uint processId2;
if (handle == GetForegroundWindow())
return;
threadId1 = GetWindowThreadProcessId(GetForegroundWindow(), out processId1);
threadId2 = GetWindowThreadProcessId(handle, out processId2);
if (threadId1 != threadId2) {
AttachThreadInput(threadId1, threadId2, true);
SetForegroundWindow(handle);
AttachThreadInput(threadId1, threadId2, false);
} else {
SetForegroundWindow(handle);
}
if (IsIconic(handle))
ShowWindow(handle, SW_RESTORE);
else
ShowWindow(handle, SW_SHOW);
}
private const int SW_SHOW = 5;
private const int SW_RESTORE = 9;
[DllImport("user32.dll", SetLastError=true)]
static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId);
[DllImport("user32.dll")]
static extern bool AttachThreadInput(uint idAttach, uint idAttachTo, bool fAttach);
[DllImport("user32.dll")]
static extern IntPtr GetForegroundWindow();
[DllImport("user32.dll")]
static extern bool SetForegroundWindow(IntPtr hWnd);
[DllImport("user32.dll")]
static extern bool IsIconic(IntPtr hWnd);
[DllImport("user32.dll")]
static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);