Проблема с фокусировкой окна в Vista
У меня есть приложение, которое управляет демографической информацией пациента. Наряду с этими данными пользователь может отсканировать изображение пациента и назначить это изображение пациенту. Когда пользователь нажимает кнопку сканирования, в качестве диалогового окна открывается отдельное приложение для сканирования изображения. При запуске этого на XP все работало нормально. Приложение для обработки изображений загрузилось нормально и получило фокус. Однако в Vista время от времени приложение для обработки изображений не фокусируется и всплывает позади основного приложения. При запуске в полноэкранном режиме или через Сервер приложений 2008 вы не можете видеть приложение, вы получаете только заблокированный экран, и кажется, что ничего не произошло. Есть ли способ изменить управление фокусировкой окна в Vista, чтобы работать так же, как в XP? Я ищу способ решить эту проблему, не внося изменений в реальное приложение, если это возможно.
4 ответа
Вы можете попробовать следующие шаги:
1. Щелкните правой кнопкой мыши на exe
2. Выберите Свойства
3. Выберите вкладку "Совместимость".
4. Проверьте Запустить эту программу в режиме пригодности к проживанию для:
5. Выберите Windows XP (пакет обновления 2)
Я думаю, вам придется внести изменения в свое приложение, чтобы приложение для обработки изображений было в центре внимания. Я предполагаю, что ваше приложение запускает приложение обработки изображений через ShellExecute
или же CreateProcess
, Если это так, вы можете получить дескриптор запущенного процесса либо через SHELLEXECUTEINFO.hProcess
(за ShellExecute
) или же PROCESS_INFORMATION.hProcess
(за CreateProcess
). Сразу после запуска приложения обработки изображений вызовите API AllowSetForegroundWindow:
AllowSetForegroundWindow(GetProcessId(hProcess));
Это позволит приложению обработки изображений при запуске запускать главное окно / диалоговое окно на переднем плане.
Вы можете перебрать все HWND верхнего уровня и идентифицировать приложение сканирования через его класс окна, а затем отправить соответствующее сообщение, чтобы поднять окно.
Я не верю, что это связано с Vista и XP. Я думаю, что просто это приложение для создания образов требует больше времени для запуска в Vista. Начиная с Windows 2000, диспетчер окон предотвращал кражу фоновых приложений на переднем плане. Когда приложение запускается, у него есть окно возможностей для создания и отображения окна, которое выйдет на передний план. Если это занимает слишком много времени, диспетчер окон считает, что текущее окно должно сохранять передний план, и запрещает другому приложению переходить на передний план, когда оно, наконец, запускается.
Я не могу придумать какой-либо конкретный способ избежать этого... кроме использования FindWindow для поиска окна других приложений после запуска приложения. Когда вы в конце концов найдете его, вызовите SetForegroundWindow, чтобы вывести его на передний план.