2011-02-08 5 views
2

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

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

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

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

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

ответ

4

Я использовал его таким образом. Обработка мыши одинакова.

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 (как , указанного в Meltdown 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

Используйте SlimDX.RawInput Чтобы действительно получить курсор от HWND (дескриптор элемента управления/FORM в), вам нужно Экстерн функции от «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.

Смежные вопросы