как отправить код нажатой клавиши ALT в буфер клавиатуры?

Тема в разделе "WASM.BEGINNERS", создана пользователем Gsan33, 3 фев 2007.

  1. Gsan33

    Gsan33 New Member

    Публикаций:
    0
    Регистрация:
    3 фев 2007
    Сообщения:
    10
    Очень прошу помочь - пришел сюда после долгих и бесплодный попыток решить задачу самостоятельно. А задача следующая: написать прогу на ассемблере, которая имитирует нажатае и удержание клавиши ALT. В старых книгах я нашел адреса слова состояния клавиатуры (40:16 и 40:17) а так же адреса буфера клавиатуры (40:1с и 40:1D).
    Но если я пытаюсь в прграмме напрямую обращаться к этим адресам, при запуске прграмма вызывает ошибку exception access violation (код возврата с0000005) и Windows просит отправит Биллу отчет.
    Я уже просто замучился - неужели это так сложно - сбросить пару байт в буфер клавы?

    Спасибо заранее всем!!

    С уважением,


    Gsan,
    инженер в прошлом, писал на на ассемблере PDP-11
     
  2. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Все верно -- защищенный режим не позволяет произвольно читать/писать в память + защищает порты. Вам нужно либо в Досе выполнять программу, либо использовать эмуляцию (т.е. создавать com а не PE), либо писать драйвер, который в нулевом кольце выполняется.
     
  3. Gsan33

    Gsan33 New Member

    Публикаций:
    0
    Регистрация:
    3 фев 2007
    Сообщения:
    10
    Mika0x65, спасибо что откликнулись...

    Под Дос не подойдет, так ка работать эта функция (выдача ALT) должна именно в WinXP а вот еще 2 совета (Com-файл и драйвер) я не понял. Что если я скомпилирую не exe а com файл операционная система позволит мне обращаться к памяти? А про драйвер я вообще не понял ничего (сорри) если можно или поясните, или дайте ссылочку

    PS - а что разве нет подпрограмм в стандартном наборе современного ассемблера типа "положить код в буфер клавиатыры"?
     
  4. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Зачем такой низкий уровень? Чем вам keybd_event не угодил?
     
  5. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    СОМ: не совсем так. Тогда ваша задача будет запущена в режиме эмуляции V86, т.е. программа будет думать, что выполнятся в DOS, не подозревая о существовании окружающей среды в виде WinXP.

    Драйвер: имеет доступ и к памяти и портам. Но СИЛЬНО не уверен, что вам это нужно.

    Хотя, правильнее всего воспользоваться сервисами WinXP, как сказал l_inc. Опишите задачу подробнее, а то так гадать бесполезно.
     
  6. Gsan33

    Gsan33 New Member

    Публикаций:
    0
    Регистрация:
    3 фев 2007
    Сообщения:
    10
    В том то и дело, что я уже написал такую программу на Visual Basic с использованием именно keyboard_event. Так вот проблема в том, что эта программа корректно работает только в обычном режиме работы (когда на экране приложения типа Notepad или Word). мне же надо послать код ALT тогда, когда работает полноэкранная игрушка, использующая Direct X. В этом случае предаются все коды нормально КРОМЕ ALT (!!!!) вот уж не знаю в чем загвоздка. Поэтому решил загнать код ALT на самом низком уровне прямо в буфер, с тем что бы уже потом его от туда вытащила программа, использующая Direct X.
     
  7. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    С DX не работал, но беглый поиск по msdn привел к ф-ии SendInput. Возможно, она поможет.
     
  8. zxm

    zxm New Member

    Публикаций:
    0
    Регистрация:
    20 июл 2006
    Сообщения:
    71
    keybd_event и mouse_event - переходники к SendInput. Если я не ошибаюсь конечно. Если оно не помагает - пожалуй единсвенное решение - драйвер.
     
  9. W4FhLF

    W4FhLF New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2006
    Сообщения:
    1.050
    Gsan33

    Покажи место вызова keybd_event, там есть пару ньюансов, может кое-что исправим и заработает.
     
  10. Gsan33

    Gsan33 New Member

    Публикаций:
    0
    Регистрация:
    3 фев 2007
    Сообщения:
    10
    Вот что я написал на VB:


    Private Sub AltButton() 'эмуляция нажатия клавиши Alt
    'эмуляция нажатия клавиши Alt
    Call keybd_event(VK_MENU, 0, 0, 0)

    End Sub

    Нормально работает в Worde, Notepad ... более того и в мою игрушку этот код попадает, но не обрабатывается как ALT... Так же попробовал еще VK_LMENU, VK_RMENU - с тем же результатом.
     
  11. Gsan33

    Gsan33 New Member

    Публикаций:
    0
    Регистрация:
    3 фев 2007
    Сообщения:
    10
    Вот что я написал на VB:


    Private Sub AltButton() 'эмуляция нажатия клавиши Alt
    'эмуляция нажатия клавиши Alt
    Call keybd_event(VK_MENU, 0, 0, 0)

    End Sub

    Нормально работает в Worde, Notepad ... более того и в мою игрушку этот код попадает, но не обрабатывается как ALT... Так же попробовал еще VK_LMENU, VK_RMENU - с тем же результатом.
     
  12. W4FhLF

    W4FhLF New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2006
    Сообщения:
    1.050
    Я к чему, в своё время я соткнулся на одной грабле, когда пытался посылать нажатия клавиш мыши в игру, я посылал так:

    Код (Text):
    1. invoke mouse_event, MOUSEEVENTF_LEFTDOWN or MOUSEEVENTF_LEFTUP, 0, 0, cbuttons, dwExtraInfo
    У меня тоже во всех окнах работало, а в игре нифига, потом догадался сделать вот так:

    Код (Text):
    1. invoke mouse_event, MOUSEEVENTF_LEFTDOWN, 0, 0, cbuttons, dwExtraInfo
    2. invoke Sleep, 50
    3. invoke mouse_event, MOUSEEVENTF_LEFTUP, 0, 0, cbuttons, dwExtraInfo
    Стало работать везде:)
    Не знаю насколько это можно применить к твоему случаю, но может будет полезно.
     
  13. zxm

    zxm New Member

    Публикаций:
    0
    Регистрация:
    20 июл 2006
    Сообщения:
    71
    Стоп, а отжимать клавишу кто будет?

    Код (Text):
    1. procedure SimulateKeyDown(Key: byte);
    2. begin
    3.   keybd_event(Key, 0, 0, 0);
    4. end;
    5.  
    6. procedure SimulateKeyUp(Key: byte);
    7. begin
    8.   keybd_event(Key, 0, KEYEVENTF_KEYUP, 0);
    9. end;
    10.  
    11. procedure SimulateKeystroke(Key: byte);
    12. begin
    13.   keybd_event(Key, 0, 0, 0);
    14.   keybd_event(Key, 0, KEYEVENTF_KEYUP, 0);
    15. end;
     
  14. W4FhLF

    W4FhLF New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2006
    Сообщения:
    1.050
    Вот вот, и ещё паузу небольшую добавь между этими событиями.
     
  15. Gsan33

    Gsan33 New Member

    Публикаций:
    0
    Регистрация:
    3 фев 2007
    Сообщения:
    10
    Отжимать буду потом, когда научусь нажимать! )) Мне надо нажать ALT, удерживая его нажать на кнопку мыши и только потом отжать. Поэтому и не отжимаю.
     
  16. trash_master

    trash_master New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2006
    Сообщения:
    319
    Адрес:
    Україна
    Gsan33
    Разве в DirectInput нет функций для отсылки и програмной емуляции нажатия клавиш ?