Проблема с фокусировкой окна в 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, чтобы вывести его на передний план.

Другие вопросы по тегам