Страница: 1 | 2 | 3 |
Вопрос: Нажать кнопку в приложении DirectX
Добавлено: 10.07.07 21:25
Автор вопроса: TERMIT | Web-сайт:
Задача у меня такова:
Нужно нажать кнопку в приложении DirectX, в игре короче говоря. Я сделал переловитель нажатия мышки. В общем при нажатии на кнопку мышки правую должно в игре нажиматься shift, потом нажиматся ENTER, и потом отжиматся shift. Я все перерыл..
SendKeys не катит, не работает =( пробовал
Call keybd_event(VK_RETURN, 0, 0, 0)
Call keybd_event(VK_RETURN, 0, KEYEVENTF_KEYUP, 0)
не выходит =((( там нужно как то говорят через DirectX буфер мутить. Подскажите, поделитесь примером, целый день потратил =( помогите а...
Ответы
Всего ответов: 33
Номер ответа: 1
Автор ответа:
vito
Разработчик Offline Client
Вопросов: 23
Ответов: 879
Web-сайт:
Профиль | | #1
Добавлено: 11.07.07 18:51
Дело в то, что приложения DX используют для ввода DInput. А эта библиотека практически полностью контролирует железо. Приложение не реагирует на основную часть сообщений операционки, что разумно в целях увеличения быстродействия. То есть в принципе можно сказать, что приложения DX будучи более низкоуровненвыми, не являбтся многозадачными.
События обрабатывает программист, читая данные из буфера, например через определенный интервал времени.
Так что начхать приложению и на SendKeys и прочее.
И разбираться надо с DInput.
А читаем мы данные из буфера вот таким образом.
didod, &dwElements, 0 );
А вот функции обратной нет. Я имею в виду SetDeviceData.
Так что... Остается найти этот буфер, прочитать из него данные, сравнить и записать новые.
И успеть сделать это быстрее чем прложение.
Номер ответа: 2
Автор ответа:
TERMIT
ICQ: 5297101
Вопросов: 16
Ответов: 93
Web-сайт:
Профиль | | #2
Добавлено: 11.07.07 19:05
Да совершенно согласен что DInput нада рыть. Но прико лв том что читаем мы так:
diDEV.GetDeviceStateKeyboard diState
а записывать вроде так:
diDEV.SendDeviceData
Целый день уже рою инфу про SendDeviceData, все как будто нафиг положили на эту функцию директа, хы реально весь инет обрыл, все ссылки что выдавал все прошел, прочитал изучил, даже на забугорных сайтах. Итог - ниче не нашел, а то что нашел почему то не пашет...
http://www.vbforums.com/showthread.php?t=294935
Посматрите пожалуйста этот пример мтожет чтото у вас выйдет...
Номер ответа: 3
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #3
Добавлено: 11.07.07 19:20
Проще контроллер написать который будет подключаться как вторая клава
Номер ответа: 4
Автор ответа:
TERMIT
ICQ: 5297101
Вопросов: 16
Ответов: 93
Web-сайт:
Профиль | | #4
Добавлено: 11.07.07 19:29
Не думаю что проще, хатя если есть готовые примеры буду очень рад!
Кстате я тут подумал, может через API как то через
SendMessage, профи API отзавитесь! Что скажите? Реально?
Номер ответа: 5
Автор ответа:
TERMIT
ICQ: 5297101
Вопросов: 16
Ответов: 93
Web-сайт:
Профиль | | #5
Добавлено: 11.07.07 19:30
Не думаю что проще, хатя если есть готовые примеры буду очень рад!
Кстате я тут подумал, может через API как то через
SendMessage, профи API отзавитесь! Что скажите? Реально?
Номер ответа: 6
Автор ответа:
TERMIT
ICQ: 5297101
Вопросов: 16
Ответов: 93
Web-сайт:
Профиль | | #6
Добавлено: 11.07.07 19:30
Не думаю что проще, хатя если есть готовые примеры буду очень рад!
Кстате я тут подумал, может через API как то через
Send Message, профи API отзавитесь! Что скажите? Реально?
Номер ответа: 7
Автор ответа:
TERMIT
ICQ: 5297101
Вопросов: 16
Ответов: 93
Web-сайт:
Профиль | | #7
Добавлено: 11.07.07 19:30
Не думаю что проще, хатя если есть готовые примеры буду очень рад!
Кстате я тут подумал, может через API как то через
SendMessage, профи API отзавитесь! Что скажите? Реально?
Номер ответа: 8
Автор ответа:
TERMIT
ICQ: 5297101
Вопросов: 16
Ответов: 93
Web-сайт:
Профиль | | #8
Добавлено: 11.07.07 19:30
Не думаю что проще, хатя если есть готовые примеры буду очень рад!
Кстате я тут подумал, может через API как то через
Send Message, профи API отзавитесь! Что скажите? Реально?
Номер ответа: 9
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #9
Добавлено: 11.07.07 19:41
Покажи как SendKeys'ом пробовал...
Номер ответа: 10
Автор ответа:
TERMIT
ICQ: 5297101
Вопросов: 16
Ответов: 93
Web-сайт:
Профиль | | #10
Добавлено: 11.07.07 19:45
SendKeys "{W}"
SendKeys "W"
SendKeys "{ENTER}"
SendKeys "{UP}"
sendkeys "{SHIFT}"
короче по разному...
Номер ответа: 11
Автор ответа:
TERMIT
ICQ: 5297101
Вопросов: 16
Ответов: 93
Web-сайт:
Профиль | | #11
Добавлено: 11.07.07 19:45
SendKeys "{W}"
SendKeys "W"
SendKeys "{ENTER}"
SendKeys "{UP}"
sendkeys "{SHIFT}"
короче по разному...
Номер ответа: 12
Автор ответа:
TERMIT
ICQ: 5297101
Вопросов: 16
Ответов: 93
Web-сайт:
Профиль | | #12
Добавлено: 11.07.07 19:45
SendKeys "{W}"
SendKeys "W"
SendKeys "{ENTER}"
SendKeys "{UP}"
sendkeys "{SHIFT}"
короче по разному...
Номер ответа: 13
Автор ответа:
vito
Разработчик Offline Client
Вопросов: 23
Ответов: 879
Web-сайт:
Профиль | | #13
Добавлено: 11.07.07 21:06
Попробуй через DX8.
Интересно что получится.
Вот примерчик.
Const ARRAYSIZE = 4
Static rgiBits(ARRAYSIZE-1) As Integer
rgiBits(0) = 1
rgiBits(1) = 2
rgiBits(2) = 4
rgiBits(3) = 2
Static iLooper As Integer
iLooper = 0
Dim cdod As Long
cdod = 3 ' Number of items
Dim rgdod(3) As DIDEVICEOBJECTDATA
Dim i as Integer
' lTimeStamp and lSequence must be set to 0
For i = 0 To 3
rgdod(i).lTimeStamp = 0
rgdod(i).lSequence = 0
Next i
rgdod(0).lOfs = NumLockID
rgdod(1).lOfs = CapsLockID
rgdod(2).lOfs = ScrollLockID
Select Case (rgiBits(iLooper) And 1)
Case Is = 0
rgdod(0).lData = 0
Case Is = 1
rgdod(0).lData = &H80 ' NumLock light on/off
End Select
Select Case (rgiBits(iLooper) And 2)
Case Is = 0
rgdod(1).lData = 0
Case Is = 1
rgdod(1).lData = &H80 ' CapsLock light on/off
End Select
Select Case (rgiBits(iLooper) And 4)
Case Is = 0
rgdod(2).lData = 0
Case Is = 1
rgdod(2).lData = &H80 ' ScrollLock light on/off
End Select
iLooper = (iLooper + 1) Mod ARRAYSIZE ' Loops from 0 to 3
Call diDevKeyboard.SendDeviceData(cdod, rgdod, 0)
End Sub
Номер ответа: 14
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #14
Добавлено: 11.07.07 23:15
Понятное дело так работать небудет. Никакие ап ненужны, задержки нужны...
http://www.firststeps.ru/vba/vbahelp/r.php?62
Номер ответа: 15
Автор ответа:
vito
Разработчик Offline Client
Вопросов: 23
Ответов: 879
Web-сайт:
Профиль | | #15
Добавлено: 12.07.07 00:06
HACKER
Здесь другой принцип работы.
1. Создается объект (девайс) для окна.
2. Создается буфер для хранения символов с клавы.
3. По таймеру мы опрашиваем буфер, на предмет наличия нажатых клавиш(т.е. окно как таковое, сообщений не получает, а просто имеет буфер для клавиш).
4. Обрабатываем клавиши как считаем нужным.
Прям как в старые добрые времена.
Фатически при создании девайса мы блокируем клаву и мышь с точки зрения операционки. Исключение составляют кажется только три клавиши.
После окончания работы освобождаем девайс.
Т.е. DInput берет под контроль сообшения от железа на более низком уровне, возможно на уровне драйвера(впрочем DX вообще большая тайна ).
И если в приложении не разрешено получение сообщений(а на кой оно нужно?), то оно ничего и не получит.
Т.е. можно разрешить виндовс клавишу а можно и не разрешить (в некоторых приложениях разрешают), можно разрешить получать стандартные сообщения окну а можно и не разрешить ( ну уж это точно не нужно).
Ладно, посмотрим что сработает. Честно говоря неи разу подобным вопросом не задавался.
А на кой оно нужно?
Или для игры можно бота написать, чтоб он за тебя играл, ну а ты только любовался.))