Глобальная эмуляция клавиатуры

Тема в разделе "WASM.BEGINNERS", создана пользователем vav, 3 окт 2006.

  1. vav

    vav New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2005
    Сообщения:
    16
    Адрес:
    Russia
    ... пишу прогу (MASM) ... управление любым приложением с пульта TV-тюнера...
    ... функция -= keybd_event =- вроде работает с оконными прогами... а с полноэкранными(DirectX) ... Хрен с маслом! Что делать то?
     
  2. vav

    vav New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2005
    Сообщения:
    16
    Адрес:
    Russia
    ... ну чтото поный молчёк... вроде ясно усе написано
     
  3. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    С чего ты взял?
    Я не уверен что там в MASM.
    Я попробовал пример на VB, и там
    Код (Text):
    1. Private Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
    прекрасно работает как с полноэкранными приложениями, так и с оконными.
    Так что с функцией все в порядке. Ищи проблемы у себя в коде.
     
  4. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Что значит "вроде работает"?
     
  5. vav

    vav New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2005
    Сообщения:
    16
    Адрес:
    Russia
    .... проверял только с всякими проигрователями видео... а например c NFSIII не пашет в самой игре (а в меню работает!)
     
  6. vav

    vav New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2005
    Сообщения:
    16
    Адрес:
    Russia
    ... что то гдето и чемто, отрубается ... вопрос чем и как это обойти?
     
  7. Shooshpanchik

    Shooshpanchik Member

    Публикаций:
    0
    Регистрация:
    29 сен 2006
    Сообщения:
    117
    что то гдето и чемто это -
    lpDIKeyboard.SetCooperativeLevel(Wnd, DISCL_FOREGROUND or DISCL_EXCLUSIVE); в самой игре. Как обойти в данном случае не знаю. Как вариант могу подсказать, поставь PuntoSwitcher и в игре нажми что нить типа lflflf, если слышно характерный звук значит как и в нем что-то надо хукать.
     
  8. vav

    vav New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2005
    Сообщения:
    16
    Адрес:
    Russia
    ... уважаемые.... что есть - PuntoSwitcher?
     
  9. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Меняет раскладку, если вводятся недопустимые сочетания в текущей.
    http://www.listsoft.ru/?id=6400
     
  10. vav

    vav New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2005
    Сообщения:
    16
    Адрес:
    Russia
    ... а может както с драйвером извратится ?(...только как? я с драйверами не работал :dntknw:( )
     
  11. vav

    vav New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2005
    Сообщения:
    16
    Адрес:
    Russia
    ... не ужели нет способа ГЛОБАЛЬНОЙ эмуляции... что бы в любом приложении на 100% типа клавишу нажал....
     
  12. Shooshpanchik

    Shooshpanchik Member

    Публикаций:
    0
    Регистрация:
    29 сен 2006
    Сообщения:
    117
    Вообще такого готового полно:
    WinLirc winlirc.sourceforge.net
    Girder girder.nl
    PC Remote Control pcremotecontrol.com
    Sly Control slydiman.narod.ru
    Если же цель именно написать самому, то думаю нужно ознакомиться с принципом работы аналогичных продуктов.
    WinLirc - infra red демон, (портирован из линукса) подходит для программ умеющих работать именно с ним.
    Girder - позволяет управлять компом через инфракрасный, последовательный, параллельный порт и даже через интернет. Умеет работать с инфракрасным портом как самостоятельно так и через WinLirc.
     
  13. morkster

    morkster New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    31
    Пишеш драйвер или другим способом добиваешся права писать в порты 60h-64h. Там есть фича писать в буффер клавы, как-будто инфа пришла с клавиатуры. Должно работать 100%, хотя имплементировать наверное геморой...
     
  14. vav

    vav New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2005
    Сообщения:
    16
    Адрес:
    Russia
    ... во ... я подозревал что както можно в буффер клавы писать... а куда свои глазки направить , чтобы не рыскать в чаще, а пойти правельным путём?
     
  15. morkster

    morkster New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    31
    Хмм.. надо поправиться. Через порты 60h-64h пишется не в буффер клавиатуры, а в буффер контроллера который принимает сигналы от PS/2 клавиатуры. Насчет usb не знаю.
    Глядеть можно в google по портам 60h и 64h а также 8042 что есть номер контроллера который этим делом вроде как заправлял в древности.
    Надо также сказать что сам я этим занимался еще в real mode под досом.
    Тогда я писал в порт 64h D2h и после писал в 60h код клавиши, который вроде как по умному называется makecode. И так
    по байту за раз, писал, что надо, не забывая писать release code, тобиш не только нажимал кнопки, но и отпускал.
    Инфу по портам пожно найти в такой фиче как Ralf Brown Interrupt list пошли бог ему здоровъя.
    С имплементацией как я уже говорил будет геморой :)
     
  16. vav

    vav New Member

    Публикаций:
    0
    Регистрация:
    14 ноя 2005
    Сообщения:
    16
    Адрес:
    Russia
    >С имплементацией как я уже говорил будет геморой

    ... имплементация - поподробнее...плиз
     
  17. BUGOR

    BUGOR New Member

    Публикаций:
    0
    Регистрация:
    14 авг 2005
    Сообщения:
    44
    А с какими флагами ты вызываешь keybd_event?
    Буквально недавно сталкивался с такой проблемой, надо было заставить кликать мышку в игре через определённый интервал времени, делал так:
    invoke mouse_event, MOUSEEVENTF_LEFTDOWN or MOUSEEVENTF_LEFTUP, 0, 0, cbuttons, dwExtraInfo
    Во всех оконных работает, в игре ни в какую... и про драйвер думал и DirectInput разбирал, но решение оказалось в доску простым:

    invoke mouse_event, MOUSEEVENTF_LEFTDOWN, 0, 0, cbuttons, dwExtraInfo
    invoke Sleep, 50
    invoke mouse_event, MOUSEEVENTF_LEFTUP, 0, 0, cbuttons, dwExtraInfo

    И всё стало работать везде... попробуй, большая вероятность, что тут ситуация аналогичная, т.к. обе функции обращаются к SendInput.
     
  18. Pinkbyte

    Pinkbyte Member

    Публикаций:
    0
    Регистрация:
    3 сен 2006
    Сообщения:
    106
    Гхрм... у меня такая же проблема... вы что, хотите сказать что здесь нужна банальная задержка?
     
  19. BUGOR

    BUGOR New Member

    Публикаций:
    0
    Регистрация:
    14 авг 2005
    Сообщения:
    44
    Pinkbyte

    сказать я ничего не хочу, я лишь констатирую факт из собственного опыта, Вы бы лучше проверили, прежде чем писать такие сообщения.
     
  20. Pinkbyte

    Pinkbyte Member

    Публикаций:
    0
    Регистрация:
    3 сен 2006
    Сообщения:
    106
    дык я проверил ужо - нихрина не прёт :dntknw:

    Система - Windows XP без сервисФАКов