Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 | 2 | 3 |

 

  Вопрос: Нажать кнопку в приложении DirectX Добавлено: 10.07.07 21:25  

Автор вопроса:  TERMIT | Web-сайт: xtec.ru | ICQ: 5297101 
Задача у меня такова:

Нужно нажать кнопку в приложении 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-сайт: softvito.narod2.ru
 Профиль | | #1
Добавлено: 11.07.07 18:51
Дело в то, что приложения DX используют для ввода DInput. А эта библиотека практически полностью контролирует железо. Приложение не реагирует на основную часть сообщений операционки, что разумно в целях увеличения быстродействия. То есть в принципе можно сказать, что приложения DX будучи более низкоуровненвыми, не являбтся многозадачными.
События обрабатывает программист, читая данные из буфера, например через определенный интервал времени.
Так что начхать приложению и на SendKeys и прочее.:)

И разбираться надо с DInput.

А читаем мы данные из буфера вот таким образом.

hr = g_pKeyboard->GetDeviceData( sizeof(DIDEVICEOBJECTDATA),
                                     didod, &dwElements, 0 );


А вот функции обратной нет. Я имею в виду SetDeviceData.

Так что... Остается найти этот буфер, прочитать из него данные, сравнить и записать новые.
И успеть сделать это быстрее чем прложение.

Ответить

Номер ответа: 2
Автор ответа:
 TERMIT



ICQ: 5297101 

Вопросов: 16
Ответов: 93
 Web-сайт: xtec.ru
 Профиль | | #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-сайт: xtec.ru
 Профиль | | #4
Добавлено: 11.07.07 19:29
Не думаю что проще, хатя если есть готовые примеры буду очень рад!

Кстате я тут подумал, может через API как то через

SendMessage, профи API отзавитесь! Что скажите? Реально?

Ответить

Номер ответа: 5
Автор ответа:
 TERMIT



ICQ: 5297101 

Вопросов: 16
Ответов: 93
 Web-сайт: xtec.ru
 Профиль | | #5
Добавлено: 11.07.07 19:30
Не думаю что проще, хатя если есть готовые примеры буду очень рад!

Кстате я тут подумал, может через API как то через

SendMessage, профи API отзавитесь! Что скажите? Реально?

Ответить

Номер ответа: 6
Автор ответа:
 TERMIT



ICQ: 5297101 

Вопросов: 16
Ответов: 93
 Web-сайт: xtec.ru
 Профиль | | #6
Добавлено: 11.07.07 19:30
Не думаю что проще, хатя если есть готовые примеры буду очень рад!

Кстате я тут подумал, может через API как то через

Send Message, профи API отзавитесь! Что скажите? Реально?

Ответить

Номер ответа: 7
Автор ответа:
 TERMIT



ICQ: 5297101 

Вопросов: 16
Ответов: 93
 Web-сайт: xtec.ru
 Профиль | | #7
Добавлено: 11.07.07 19:30
Не думаю что проще, хатя если есть готовые примеры буду очень рад!

Кстате я тут подумал, может через API как то через

SendMessage, профи API отзавитесь! Что скажите? Реально?

Ответить

Номер ответа: 8
Автор ответа:
 TERMIT



ICQ: 5297101 

Вопросов: 16
Ответов: 93
 Web-сайт: xtec.ru
 Профиль | | #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-сайт: xtec.ru
 Профиль | | #10
Добавлено: 11.07.07 19:45

SendKeys "{W}"
SendKeys "W"
SendKeys "{ENTER}"
SendKeys "{UP}"
sendkeys "{SHIFT}"

короче по разному...

Ответить

Номер ответа: 11
Автор ответа:
 TERMIT



ICQ: 5297101 

Вопросов: 16
Ответов: 93
 Web-сайт: xtec.ru
 Профиль | | #11
Добавлено: 11.07.07 19:45

SendKeys "{W}"
SendKeys "W"
SendKeys "{ENTER}"
SendKeys "{UP}"
sendkeys "{SHIFT}"

короче по разному...

Ответить

Номер ответа: 12
Автор ответа:
 TERMIT



ICQ: 5297101 

Вопросов: 16
Ответов: 93
 Web-сайт: xtec.ru
 Профиль | | #12
Добавлено: 11.07.07 19:45

SendKeys "{W}"
SendKeys "W"
SendKeys "{ENTER}"
SendKeys "{UP}"
sendkeys "{SHIFT}"

короче по разному...

Ответить

Номер ответа: 13
Автор ответа:
 vito



Разработчик Offline Client

Вопросов: 23
Ответов: 879
 Web-сайт: softvito.narod2.ru
 Профиль | | #13
Добавлено: 11.07.07 21:06
Попробуй через DX8.
Интересно что получится.

Вот примерчик.

Private Sub FlashLEDs()
    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-сайт: softvito.narod2.ru
 Профиль | | #15
Добавлено: 12.07.07 00:06
HACKER

Здесь другой принцип работы.

1. Создается объект (девайс) для окна.
2. Создается буфер для хранения символов с клавы.
3. По таймеру мы опрашиваем буфер, на предмет наличия нажатых клавиш(т.е. окно как таковое, сообщений не получает, а просто имеет буфер для клавиш).
4. Обрабатываем клавиши как считаем нужным.
Прям как в старые добрые времена.:)

Фатически при создании девайса мы блокируем клаву и мышь с точки зрения операционки. Исключение составляют кажется только три клавиши.
После окончания работы освобождаем девайс.
Т.е. DInput берет под контроль сообшения от железа на более низком уровне, возможно на уровне драйвера(впрочем DX вообще большая тайна :)).

И если в приложении не разрешено получение сообщений(а на кой оно нужно?), то оно ничего и не получит.
Т.е. можно разрешить виндовс клавишу а можно и не разрешить (в некоторых приложениях разрешают), можно разрешить получать стандартные сообщения окну а можно и не разрешить ( ну уж это точно не нужно).

Ладно, посмотрим что сработает. Честно говоря неи разу подобным вопросом не задавался.
А на кой оно нужно?
Или для игры можно бота написать, чтоб он за тебя играл, ну а ты только любовался.:)))

Ответить

Страница: 1 | 2 | 3 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам