Режим киоска для устаревшего 16-разрядного приложения

#c# #winapi #keyboard #hook #dos

#c# #winapi #клавиатура #перехват #dos

Вопрос:

Мне нужно программно свернуть и развернуть полноэкранное 16-разрядное приложение. К сожалению, DOSBox не подходит, поскольку это приложение взаимодействует с некоторыми периферийными устройствами, не поддерживаемыми DOSBox.

Я смог написать код (сильно зависящий от Win32 API), который может устанавливать фокус, отправлять клавиши alt enter и сворачивать / разворачивать.

Все бы сработало, однако некоторые пользователи выяснили, что Alt Enter могут выйти из полноэкранного режима, и начали злоупотреблять этим.

Я могу отключить Alt Enter, используя настройки в PIF, но это нарушает мой подход к программной отправке этих ключей.

Есть ли лучшая альтернатива для программного переключения NTVDM на полноэкранный режим, чем отправка Alt Enter?

Я использовал Spy и обнаружил, что для достижения полноэкранного режима NTVDM изменял разрешение системы на 640 x 480.

Я попытался вызвать API ChangeDisplaySettings, чтобы переключать разрешения по мере необходимости, но когда я установил 640 x 480, NTVDM все еще работает как оконное приложение.

Я рассматриваю возможность настройки низкоуровневого подключения клавиатуры (http://msdn.microsoft.com/en-us/library/ms644985 (v = против 85).aspx) для фильтрации нажмите Alt Enter. Я мог бы отключить перехват на то короткое время, которое требуется моему приложению для его отправки. Это звучит как опасный взлом, который может иметь множество побочных эффектов. Я также не уверен, что это сработает, поскольку NTVDM, похоже, не использует цикл сообщений для обработки ввода с клавиатуры. API SendMessage не выдает результатов, и Alt Enter пришлось отправлять с использованием keybd_event API. Есть мысли?

Ответ №1:

Как насчет другого подхода — прекратите пытаться заблокировать его. Вместо этого следите за окном (скажем, 10 раз в секунду), если оно не полноэкранное и вы не отправляли Alt-Enter в последние пару секунд, отправьте его.

Если кто-то нажмет Alt-Enter, откроется окно и сразу же вернется к полноэкранному режиму.