Установите активное / сфокусированное окно в приложении Windows WPF - PullRequest
0 голосов
/ 12 июля 2020

У меня есть настольное приложение 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

Кто-нибудь знает, как это решить?

...