Автор: Jack Hackslay
Direct Input дает вам доступ ко всем устройствам ввода, подключенным к системе пользователя. В Visual Basic вы можете использовать эти четыре устройства:
Ну...... | |
А почему бы и нет | |
??? | |
Force-Feedback |
Стоит на Play Station |
Я не могу дать учебник по использованию Force Feedback вот почему:
a: Трудновато
b: Вам понадобятся специальные программы
c:
Нету его у меня
Как вы знаете, в Visual Basic встроены функции обработки мыши и
клавиатуры через события Form_KeyPress, Form_KeyDown,
Form_KeyUp, Form_MouseMove, Form_MouseUp, Form_MouseDown
Код, который мы
будем писать для DirectInput будет практически такой же, что обычно используется
в этих событиях.
К джойстику можно подступиться через API, но DirectInput проще, хотя функции почти идентичны.
Было бы хорошо, если бы вы знали каким
образом обрабатывается клавиатура в VB, но на всякий случай я еще раз по этому
пробегусь. Каждый символ на клавиатуре имеет свой номер, вы можете узнать, какая
клавиша нажата, рассматривая значение, возвращенное специальной функцией. Если
значение = 0, тогда ничего не нажали, если больше нуля, значит нажата какая-то
клавиша.
Список клавиш можно загрузить здесь .
Давайте начнем создавать программу.
Создайте новый проект и
добавьте к нему библиотеку DX7, затем можете копировать следующий код в нужные
места.
Также, вам понадобится пустая форма с таймером на ней, названным tmrKey. Все значения для него устанавливаются в коде, так что не волнуйтесь на этот счет.
'(DECLARATIONS) Private
Sub Form_Load() Set diDEV = di.CreateDevice("GUID_SysKeyboard") 'Attach it to the Keyboard
diDEV.SetCommonDataFormat DIFORMAT_KEYBOARD Me.Show diDEV.Acquire 'Эта строка переводит все значения из DirectX в Visual Basic tmrKey.Interval = 10 'Это сенс клавиатуры. Большое преимущество DI в том,
что вы сами можете устанавливать Private Sub Form_Unload(Cancel As
Integer) Private Sub tmrKey_Timer()
For iKeyCounter
= 0 To 255 'Пройтись по всем значениям и
посмотреть, не нажали ли чего?.......... |
Вы можете изменять код Таймера, чтобы в цикле применять логические операторы If...Then....End If Для того чтобы обрабатывать нужные вам клавиши
Например:
'Как видите, можно обрабатывать одновременное нажатие многих клавиш, чего не позволяет VB!!! Private Sub tmrKey_Timer()
If diState.Key(200)<>0
then |
Спасибо, что прочитали мое Очень Простое Клавиатурное Руководство. Вы можете загрузить готовый проект прямо сейчас.
Мышиная обработка довольно запутанна. Я использую ее только для случаев, когда необходим дополнительный контроль. Если вы хотите только вычислять позиции мыши, лучше используйте Form_MouseMove.
Однако, я все же освещу обработку мыши для самых любопытных. Это пример простой программы, которая рисует линии в зависимости от местоположения курсора мыши.
Создайте новый проект с подключенной библиотекой DX7. Добавьте к проекту модуль и сделайте стартовым объектом "Sub_Main"
Переименуйте форму в frmCanvas, сделайте ее фон белым и добавьте в верхний левый угол объект Image, который назовите imgPencil. Выберите подходящую иконку из коллекции VB и загрузите ее в Image.
Меню:
Нам понадобится меню в проекте. Я подразумеваю, что вы знаете, как добавлять меню, если нет - идите и учите руководство пользователя. Используйте эту схему для создания меню. Сначала указываются названия (Caption), а имена (Name) идут в скобках.
none (mnuContext) - NOTE: уберите
флаг visible |
Теперь, поместите этот код в МОДУЛЬ!
'(DECARATIONS) Public objDX As New
DirectX7 Public g_cursorx As Long
Public EventHandle As Long
Public procOld As Long ' Windows API declares and constants Public Const GWL_WNDPROC =
(-4) Public Declare Function
GetCursorPos Lib "user32" (lpPoint As POINTAPI) As
Long Public Type POINTAPI
Sub Main() ' Показать сначала главную форму, чтобы мы могли
использовать ее Handle.
' Инициализируем наш курсор ' Спросить об уведомлениях
Public Function SysMenuProc(ByVal
hWnd As Long, ByVal iMsg As Long, _ ' Эта процедура интерпретирует
сообщения Windows и смотрит за теми, по которым If iMsg = WM_ENTERMENULOOP
Then End Function |
Сохраните модуль, затем добавьте этот код в модуль кода ФОРМЫ:
'(DECLARATIONS) Sub AcquireMouse()
UpdateCursor
Public Sub Popup()
Public Sub
SetSystemCursor() Public Sub UpdateCursor()
Private Sub DirectXEvent_DXCallback(ByVal eventid As Long) ' Здесь мы распознаем
изменения в положении мыши. Обычно это движение по осям Dim diDeviceData(1 To
BufferSize) As DIDEVICEOBJECTDATA Private Sub Form_KeyDown(KeyCode
As Integer, Shift As Integer) Private Sub Form_MouseMove(Button
As Integer, Shift As Integer, x As Single, y As Single)
Private Sub Form_MouseUp(Button As
Integer, Shift As Integer, x As Single, y As Single) Private Sub Form_Unload(Cancel As
Integer) Private Sub
mnuClear_Click() Private Sub
mnuSpeed1_Click() Private Sub
mnuSpeed2_Click() Private Sub
mnuSpeed3_Click() Private Sub
mnuSuspend_Click() |
Ну вот!
Когда вы запустите программу, мышь
должна быть "поймана" внутри окна. Курсор должен быть в виде иконки,
которую вы выбрали и когда вы удержите левую кнопку мыши, должна рисоваться
черная линия, а когда вы щелкните правой кнопкой, должно появляться маленькое
всплывающее меню.
Вы можете загрузить готовый проект.
Команды обработки джойстика возвращают количество джойстиков в системе, значения X & Y, а также статус каждой кнопки джойстика.
В этом учебнике я покажу вам программу с тремя списками. Первый перечисляет доступные устройства, второй значения X и Y, третий перечисляет все кнопки.
Откройте Visual Basic, создайте новый проект и добавьте нужную DLL.
На форму добавьте 3 списка:
1 -
lstJoySticks
2 - lstJoyAxis
3 - lstButton
Затем, скопируйте код в соответствующие секции. Все поясняется, поэтому не должно быть очень сложно для понимания:
'(DECLARATIONS) Dim dx
As New DirectX7 'Главный
объект DirectX Sub
CLRLISTS() 'Маленькая
процедура для очистки всего, чего можно Sub IdentifyAxes(diDev As
DirectInputDevice) Sub InitDirectInput() Set di =
dx.DirectInputCreate() 'Создать DI
из DX. Это надо сделать перед всем остальным 'Добавить подключенные джойстики в список
'Получить handle события, чтобы
ассоциировать его с устройстом Error_Out: Sub SetProp() Private Sub
DirectXEvent_DXCallback(ByVal eventid As Long) 'Получить инфо
об устройстве 'Отобразить
осевые координаты End
If Case
Else Private Sub
Form_Load() Private Sub Form_Unload(cancel As
Integer) Private Sub
lstJoySticks_Click() 'Происходит, когда
пользователь выбирает новый джойстик из списка
'Спросим об событии 'Установить "мертвую зону" для осей X
и Y в 10% от возвожного перемещения 'Установить "светлую зону" в
5% SetProp
diDev.Acquire 'Получить список текущих свойств
' Обрабатываем устройство так, чтобы
получить события, когда они будут While running =
True |
Я могу только обещать, что большая часть этого кода будет работать, потому что у меня есть только ОЧЕНЬ паршивый джойстик. У меня только 2 кнопки и оси X/Y. Если у вас чего-нибудь не работает, дайте мне знать.
(Я вообще ничего обещать не могу, так как джойстика не имею. Поэтому баги фиксить не в состоянии :) Прим. перев.)
Готовый проект тута .
That's it!
Перевод на русский язык (c)2000 Antiloop
Публикуется с разрешения автора.
Полное или частичное
цитирование перевода
только с разрешения переводчика.
Пишите