Работа с пакетом D3DFrame

       

Установка уровня кооперации


Поскольку DirectX предоставляет прямой доступ к аппаратуре, очень важен уровень кооперации устройства. Он определяет как программа может использовать данный ресурс совместно с другими приложениями. Если вы установите монопольный режим, больше никто не сможет воспользоваться данным ресурсом. Если вы установите совместный режим, то доступ к клавиатуре смогут получить все желающие. Уверен, вы можете вспомнить игры, которые не делят клавиатуру ни с кем. Мне на ум приходит EverQuest. Поскольку создатели игры не хотели, чтобы сторонние разработчики писали приложения для их игры, они заблокировали использование клавиатуры вне их программы. Это не слишком хорошо и может вызвать настоящие проблемы, если вы переключитесь из игры на другое приложение, чтобы проверить почту или сделать что-нибудь еще.

Для установки уровня кооперации применяется функция IDirectInputDevice8::SetCooperativeLevel(). Вот ее прототип:

HRESULT SetCooperativeLevel( HWND hwnd, DWORD dwFlags );

В ее первом параметре, hwnd, передается дескриптор окна, которое будет связано с устройством. Я в этом параметре передаю дескриптор, который был возвращен мне при создании главного окна.

Второй параметр, dwFlags, задает уровень кооперации устройства. Доступные уровни перечислены в таблице 9.1.

Таблица 9.1. Уровни кооперации устройств

Значение Описание
DISCL_BACKGROUND Доступ к клавиатуре будет предоставлен даже если окно свернуто.
DISCL_EXCLUSIVE Предоставляется монопольный доступ к клавиатуре, для всех остальных клавиатура недоступна.
DISCL_FOREGROUND Доступ к данным клавиатуры предоставляется только когда окно активно.
DISCL_NONEXCLUSIVE Устройство используется совместно с другими программами.
DISCL_NOWINKEY Блокирует клавишу Windows.

Для рассматриваемого примера я устанавливаю флаги уровня кооперации DISCL_NONEXCLUSIVE и DISCL_FOREGROUND. Благодаря этому программа использует клавиатуру совместно с другими приложениями, а сама может читать данные клавиатуры только когда ее окно активно.



Содержание раздела