SlimDX DirectInput Инициализация - PullRequest
2 голосов
/ 08 февраля 2011

Я недавно перешел с MDX 2.0 на SlimDX, используя Direct3D 11, но я изо всех сил пытаюсь реализовать управление с клавиатуры и мыши.

В MDX вы можете использовать

keyb = new Microsoft.DirectX.DirectInput.Device(SystemGuid.Keyboard);
keyb.SetCooperativeLevel(this, CooperativeLevelFlags.Background | CooperativeLevelFlags.NonExclusive);
keyb.Acquire();

настроить интерфейс клавиатуры, однако SlimDX имеет другой метод.В SlimDX Device является абстрактным классом, вместо этого есть класс Keyboard, который должен быть инициализирован путем передачи объекта DirectInput, но я не могу на всю жизнь понять, как создать объект DirectInput или для чего он нужен.

Насколько я могу найти, документация для SlimDX довольно скудная, если кто-нибудь знает о каких-либо хороших ресурсах для изучения его специфических особенностей, которые были бы фантастическими, спасибо.

Ответы [ 2 ]

4 голосов
/ 08 февраля 2011

Я использовал это таким образом. Работа с мышью такая же.

using SlimDX.DirectInput;

private DirectInput directInput;
private Keyboard keyboard;

[...]

//init
directInput = new DirectInput();
keyboard = new Keyboard(directInput);
keyboard.SetCooperativeLevel(form, CooperativeLevel.Nonexclusive | CooperativeLevel.Background);
keyboard.Acquire();

[...]

//read
KeyboardState keys = keyboard.GetCurrentState();

Но вы должны использовать SlimDX.RawInput, потому что Microsoft рекомендует его:

Хотя DirectInput является частью Библиотеки DirectX, не было значительно пересмотрен со времен DirectX 8 (2001-2002). Microsoft рекомендует новые приложения используют Цикл сообщений Windows для клавиатуры и ввод мыши вместо DirectInput (как указано в расплавлении 2005 слайд-шоу [1]) и использовать XInput вместо DirectInput для Xbox 360 контроллеры.

(http://en.wikipedia.org/wiki/DirectInput)

Пример rawinput мыши (клавиатура почти такая же):

SlimDX.RawInput.Device.RegisterDevice(UsagePage.Generic, UsageId.Mouse, SlimDX.RawInput.DeviceFlags.None);
            SlimDX.RawInput.Device.MouseInput += new System.EventHandler<MouseInputEventArgs>(Device_MouseInput);

Теперь вы можете реагировать на события.

1 голос
/ 27 ноября 2011

Используйте SlimDX.RawInput Чтобы фактически получить курсор от hWnd (дескриптор элемента управления / формы), вам нужно удалить функции из «user32.dll»

  1. BOOL GetCursorPos (LPOINT lpPoint)

с использованием System.Runtime.Interlop и System.Drawing.Point (если вы не решили вместо этого создать структуру POINT).

[DllImport("user32.dll",CallingConvention=CallingConvention.StdCall)]
[return: MarshalAs(UnmanagedType.Bool)]
internal unsafe static extern bool GetCursorPos(Point* lpPoint);

Это даст вам фактическое положение курсора на экране рабочего стола. Затем вы возьмете адрес lpPoint и передадите его в ScreenToClient (HWND hWnd, LPPOINT lpPoint), который также возвращает BOOL.

[DllImport("user32.dll",CallingConvention=CallingConvention.StdCall,SetLastError=true)]
internal static extern int ScreenToClient(IntPtr hWnd, Point* p);

Давайте тогда просто получим из этого Точку:

public unsafe Point GetClientCurorPos(IntPtr hWnd, Point*p)
{
    Point p = new Point();
    if (GetCursorPos(&p))
    {
       ScreenToClient(hWnd, &p);
    }
    return p;
}

Вы можете использовать обработчик SlimDX.RawInput.Device.MouseInput, если хотите, или можете просто выполнить какое-то кодирование в переопределении для WndProc, которое предпочитают использовать для обработки сообщений, к которым все мы, программисты WINAPI, просто привыкли утомительное письмо с этим. Однако чем ниже вы идете, тем больше у вас контроля. Как я уже сказал, вы получаете всю информацию, кроме позиции мыши, из MouseInputEventArgs обработчика. Я считаю, что лучше проверять обработанные сообщения с помощью обратного вызова WndProc.

...