У меня есть настольное приложение WPF C#, которое установлено на Windows 10 P C. Приложение используется клиентами на стойке регистрации, где они выполняют определенный c набор задач. На последнем шаге приложение запускает URL-адрес, используя веб-браузер «по умолчанию», чтобы они могли завершить последний шаг. Этот последний шаг должен быть выполнен в Интернете.
После того, как клиент выполнит последнюю задачу в окне браузера (обычно это занимает около 15 секунд), мне нужно, чтобы приложение Windows снова стало активным / сфокусированное окно. В противном случае, когда следующий покупатель подходит к прилавку, он видит окно браузера. Но им нужно увидеть приложение WPF.
В моем коде я создаю DispatcherTimer с 30-секундным таймером, который запускается непосредственно перед тем, как приложение запускает URL:
DispatcherTimer focus_timer = new DispatcherTimer();
focus_timer.Interval = TimeSpan.FromSeconds(30);
focus_timer.Tick += new EventHandler(focus_timer_Tick);
Код в событии таймера:
focus_timer.Stop();
this.Activate();
this.Focus();
Приведенный выше код не повлиял - Chrome все еще находится на переднем плане над приложением WPF Windows. Затем я попытался использовать функцию SetForegroundWindow из user32.dll со следующим неуправляемым кодом:
// code in the Window class
[DllImport("user32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
static extern bool SetForegroundWindow(IntPtr hWnd);
// code in the timer tick event
focus_timer.Stop();
IntPtr windowHandle = new WindowInteropHelper(this).Handle;
bool is_ok = SetForegroundWindow(windowHandle);
Это тоже не сработало. Приведенный выше код просто заставляет значок приложения WPF на панели задач Windows пульсировать, и снова Chrome остается сверху. Я также пробовал следующий код:
// code in the Window class
[DllImport("user32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
static extern IntPtr SetFocus(IntPtr hWnd);
[DllImport("user32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
static extern IntPtr SetActiveWindow(IntPtr hWnd);
// code in the timer tick event
IntPtr windowHandle = new WindowInteropHelper(this).Handle;
IntPtr ptrActive = SetActiveWindow(windowHandle);
IntPtr ptrFocus = SetFocus(windowHandle);
Приведенный выше код тоже ничего не делает.
ptrActive возвращает: 0x00000000
ptrFocus возвращает: 0x0004086a
Кто-нибудь знает, как это решить?