Использование DirectX Dinput8.dll непосредственно в C#

#c# #directx

#c# #directx

Вопрос:

Я пишу код и приложение, для которого требуется доступ к DirectX на C #. В частности, для этого требуется доступ к Dinput8.dll функция DirectInput8Create.

Я на самом деле делаю некоторые перехваты .. и в настоящее время я просто пытаюсь перехватить вызов и передать его. У меня возникают проблемы только с поиском правильных типов переменных для вызова DLL.

У меня только что была мозговая волна, и я думаю, что мне нужно будет использовать Unsafe, чтобы заставить его работать .. но я не уверен на 100%.

Комментарии:

1. Ваш вопрос был бы лучше, если бы вы предоставили немного больше деталей и показали некоторый код. Какие функции вам нужны в Dinput8.dll ? Может быть канонический способ сделать то, что вы хотите, в управляемом коде.

2. Спасибо за это, Роберт. Я действительно включил эту функцию. Я также указал, что я выполняю подключение API. Поэтому мне нужно иметь возможность, по крайней мере, проходить через переменные, которые использует приложение, уже использующее функцию DirectInput8Create .

3. Итак, я попробовал некоторый небезопасный код.. [DllImport("Dinput8.dll",CharSet = CharSet.Unicode,SetLastError =true,CallingConvention = CallingConvention.StdCall)] static extern unsafe int DirectInput8Create(IntPtr hinst, UInt32 dwversion,Guid refid,out void **lpvoid, int* Fail); Но это все равно не радует. У кого-нибудь есть идеи?

4. static unsafe int CreateDevice_Hooked(IntPtr hinst, UInt32 dwversion, Guid refid, out int*[] lpvoid, void* Fail) { return DirectInput8Create(hinst, dwversion, refid, out lpvoid, Fail); } Новейшая версия кода… Это работает немного лучше.. но все равно зависает приложение.

Ответ №1:

Извините, что затронул старый пост, но для людей, которые ищут причину сбоя этого перехвата, кажется, что подключенная функция вызывается изнутри перехвата. Это создает переполнение.

Ответ №2:

Я не уверен, почему вы сразу перешли к подключению… Так что я, возможно, что-то упускаю из-за неопределенности вопроса.

Если вы хотите подключить DirectX из c #, это одно… Но если вам просто нужен реальный доступ к DX, прямой ввод, тогда я бы просто использовал SharpDX

Я использовал его раньше, в частности, с прямым вводом, чтобы получить прямой доступ к контроллеру Xbox, подключенному к ПК с Windows, и это было совершенно без проблем.

Комментарии:

1. #DX не поддерживает DX8, к сожалению, на данный момент у них есть экспериментальная поддержка DX9.

2. @JonathanDickinson Я не знаю, почему вы так думаете.. Я смотрю на код прямо сейчас: code.google.com/p/sharpdx/source/browse/Source/… Довольно ясно, что он вызывает Dinput8.dll … например: DInput. DirectInput8Create и т.д.

3. Хммм… Тогда их целевая страница устарела :).

4. Да .. так что я подключаюсь.. Это для расширения приложения, которое мы уже используем. Мне нужно иметь возможность перехватить его, настраивая Dinput. В основном для того, чтобы я мог получать указатели из таблиц Vt. В конечном итоге мы пытаемся перехватить GetDeviceStatus, чтобы мы могли добавлять пользовательский ввод с другого устройства, с которого мы извлекаем показания.. Это долгая история, и мы бы написали драйвер, если бы думали, что это сработает, но это не сработает. Итак, мы пытаемся «обмануть» систему и вставить информацию напрямую.

5. Вы можете использовать EasyHook для подключения собственного API из .NET / C #: easyhook.codeplex.com