#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, откроется окно и сразу же вернется к полноэкранному режиму.