Очень прошу помочь - пришел сюда после долгих и бесплодный попыток решить задачу самостоятельно. А задача следующая: написать прогу на ассемблере, которая имитирует нажатае и удержание клавиши ALT. В старых книгах я нашел адреса слова состояния клавиатуры (40:16 и 40:17) а так же адреса буфера клавиатуры (40:1с и 40:1D). Но если я пытаюсь в прграмме напрямую обращаться к этим адресам, при запуске прграмма вызывает ошибку exception access violation (код возврата с0000005) и Windows просит отправит Биллу отчет. Я уже просто замучился - неужели это так сложно - сбросить пару байт в буфер клавы? Спасибо заранее всем!! С уважением, Gsan, инженер в прошлом, писал на на ассемблере PDP-11
Все верно -- защищенный режим не позволяет произвольно читать/писать в память + защищает порты. Вам нужно либо в Досе выполнять программу, либо использовать эмуляцию (т.е. создавать com а не PE), либо писать драйвер, который в нулевом кольце выполняется.
Mika0x65, спасибо что откликнулись... Под Дос не подойдет, так ка работать эта функция (выдача ALT) должна именно в WinXP а вот еще 2 совета (Com-файл и драйвер) я не понял. Что если я скомпилирую не exe а com файл операционная система позволит мне обращаться к памяти? А про драйвер я вообще не понял ничего (сорри) если можно или поясните, или дайте ссылочку PS - а что разве нет подпрограмм в стандартном наборе современного ассемблера типа "положить код в буфер клавиатыры"?
СОМ: не совсем так. Тогда ваша задача будет запущена в режиме эмуляции V86, т.е. программа будет думать, что выполнятся в DOS, не подозревая о существовании окружающей среды в виде WinXP. Драйвер: имеет доступ и к памяти и портам. Но СИЛЬНО не уверен, что вам это нужно. Хотя, правильнее всего воспользоваться сервисами WinXP, как сказал l_inc. Опишите задачу подробнее, а то так гадать бесполезно.
В том то и дело, что я уже написал такую программу на Visual Basic с использованием именно keyboard_event. Так вот проблема в том, что эта программа корректно работает только в обычном режиме работы (когда на экране приложения типа Notepad или Word). мне же надо послать код ALT тогда, когда работает полноэкранная игрушка, использующая Direct X. В этом случае предаются все коды нормально КРОМЕ ALT (!!!!) вот уж не знаю в чем загвоздка. Поэтому решил загнать код ALT на самом низком уровне прямо в буфер, с тем что бы уже потом его от туда вытащила программа, использующая Direct X.
keybd_event и mouse_event - переходники к SendInput. Если я не ошибаюсь конечно. Если оно не помагает - пожалуй единсвенное решение - драйвер.
Вот что я написал на VB: Private Sub AltButton() 'эмуляция нажатия клавиши Alt 'эмуляция нажатия клавиши Alt Call keybd_event(VK_MENU, 0, 0, 0) End Sub Нормально работает в Worde, Notepad ... более того и в мою игрушку этот код попадает, но не обрабатывается как ALT... Так же попробовал еще VK_LMENU, VK_RMENU - с тем же результатом.
Вот что я написал на VB: Private Sub AltButton() 'эмуляция нажатия клавиши Alt 'эмуляция нажатия клавиши Alt Call keybd_event(VK_MENU, 0, 0, 0) End Sub Нормально работает в Worde, Notepad ... более того и в мою игрушку этот код попадает, но не обрабатывается как ALT... Так же попробовал еще VK_LMENU, VK_RMENU - с тем же результатом.
Я к чему, в своё время я соткнулся на одной грабле, когда пытался посылать нажатия клавиш мыши в игру, я посылал так: Код (Text): invoke mouse_event, MOUSEEVENTF_LEFTDOWN or MOUSEEVENTF_LEFTUP, 0, 0, cbuttons, dwExtraInfo У меня тоже во всех окнах работало, а в игре нифига, потом догадался сделать вот так: Код (Text): invoke mouse_event, MOUSEEVENTF_LEFTDOWN, 0, 0, cbuttons, dwExtraInfo invoke Sleep, 50 invoke mouse_event, MOUSEEVENTF_LEFTUP, 0, 0, cbuttons, dwExtraInfo Стало работать везде Не знаю насколько это можно применить к твоему случаю, но может будет полезно.
Стоп, а отжимать клавишу кто будет? Код (Text): procedure SimulateKeyDown(Key: byte); begin keybd_event(Key, 0, 0, 0); end; procedure SimulateKeyUp(Key: byte); begin keybd_event(Key, 0, KEYEVENTF_KEYUP, 0); end; procedure SimulateKeystroke(Key: byte); begin keybd_event(Key, 0, 0, 0); keybd_event(Key, 0, KEYEVENTF_KEYUP, 0); end;
Отжимать буду потом, когда научусь нажимать! )) Мне надо нажать ALT, удерживая его нажать на кнопку мыши и только потом отжать. Поэтому и не отжимаю.