Кто-нибудь работал с WinApi функцией "GetKeyboardState"?

Предыдущая тема Следующая тема Перейти вниз

Кто-нибудь работал с WinApi функцией "GetKeyboardState"?

Сообщение  electrik в Вт Мар 10, 2009 12:30 am

пытаюсь разобраться с этой функцией, почему-то не работает.
код:
dim keys(0 to 255) as byte
do
GetKeyboardState(@keys(0))
if keys(VK_F1) and &h80) then beep
sleep 25
loop

ну а теперь описание.

declare function GetKeyboardState (byval as PBYTE) as BOOL
GetKeyboardState отыскивает состояние каждой клавиши на клавиатуре и размещает информацию в массив. Каждый элемент массива с 256 элементами идентифицирует
информацию относительно виртуальной клавиши, чей
код виртуальной клавиши
соответствует индексу элемента.На вашей клавиатуре нет 256 клавиш?Это сделано с прицелом на будущее. Если установлен бит &H1 , та клавиша выключена. Если
установлен бит &H80, клавиша в настоящее время включена.

Примечание:Обратите внимание,что функции передается массив,указывая его первый элемент.
Возвращаемое значение

В случае ошибки функция возвращает 0 (используйте
GetLastError
для получения кода ошибки). В успешном случае функция возвращает значение отличное от нуля.
Параметры

pbKeyStateМассив байтов с 256 элементами, который получает информацию состояния для всех виртуальных клавиш. Каждая клавиша идентифицирована элементом,
соответствующим
коду виртуальной клавиши.
Windows NT, 2000: В дополнение к виртуальным клавишам, массив также получает информацию, способную различать левый и правый клавиши Ctrl, Alt, и SHIFT,
которые помещены в массив в следующих индексах:
VK_LSHIFT = &HA0Левый Shift.
VK_RSHIFT = &HA1Правыйt Shift.
VK_LCONTROL = &HA2Левый Ctrl.
VK_RCONTROL = &HA3Правый Ctrl.
VK_LMENU = &HA4Левый Alt.
VK_RMENU = &HA5Правый Alt.

для чего мне это надо. я пользуюсь программой экранного доступа Jaws, ну она, типа имеет клавиатурный перехватчик, и стандартные функции FreeBasic, типа "multikey" не идут. точнее идут с выгруженным jaws. мне нужно обрабатывать комбинации клавиш типа
ctrl+pageup
shift+right
и т.д.
может GetKeyboardState поможет, хотя я не уверен. кстати, jaws я выгружал, все-равно выше преведенный код неработает.

electrik

Сообщения : 394
Дата регистрации : 2008-09-02
Возраст : 36
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Кто-нибудь работал с WinApi функцией "GetKeyboardState"?

Сообщение  DiG. GeRR в Вт Мар 10, 2009 8:01 pm

Если честно, никогда с этой функцией не сталкивался. Посмотрел под отладчиком - массив вообще не изменяется после первого вызова. То есть на клавиатуру не реагирует.
А в документации написано:
"An application can call this function to retrieve the current status of all the virtual keys. The status changes as a thread removes keyboard messages from its message queue. The status does not change as keyboard messages are posted to the message queue."
Похоже, что эту функцию нельзя вызывать из приложений, не имеющих окон, а, значит, и циклов обработки сообщений. Придется опрашивать функциями вроде GetKeyState.

DiG. GeRR

Сообщения : 101
Дата регистрации : 2009-01-30
Возраст : 25
Откуда : Рудный, Казахстан

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Кто-нибудь работал с WinApi функцией "GetKeyboardState"?

Сообщение  electrik в Вт Мар 10, 2009 8:12 pm

ну microsoft! задолбали они с этими окнами, такая же ситуация с большинством голосовых движков под sapi4. ну не хотят они говорить в консольных окнах. про функцию GetKeyState, знаю, спасибо, придеться работать с ней. впринципе я уже пробовал, но не обрабатывал несколько подрят нажатых клавиш. убить их этих мелкомягких надо!
впринципе, можно создать любое gui окно, и его не показывать, ладно, будем мудрить.

electrik

Сообщения : 394
Дата регистрации : 2008-09-02
Возраст : 36
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Кто-нибудь работал с WinApi функцией "GetKeyboardState"?

Сообщение  electrik в Вт Мар 10, 2009 9:16 pm

ну вот таким способом, можно работать с клавиатурой в консоли, через winApi. только мне, это не помогло, все-равно клавиатурный перехватчик срабатывает быстрее.

код:
#include "windows.bi"
dim keys(0 to 255) as byte 'массив из 256 элементов, для каждой виртуальной клавиши
dim i as integer
do
for i as integer = 0 to 255

'опросим состояние каждой клавиши и запишем в массив
keys(i) = getKeyState(i)
next

if keys(VK_RETURN) and &h80 then 'если нажали enter
print "enter"
end if

if keys(VK_LSHIFT) and &h80 and keys(VK_RIGHT) and &h80 then 'если нажали shift+вправо
beep
print"beep signal"
end if
sleep_ 50
loop until keys(VK_ESCAPE ) and &h80 'выходим из проги по esc

electrik

Сообщения : 394
Дата регистрации : 2008-09-02
Возраст : 36
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Кто-нибудь работал с WinApi функцией "GetKeyboardState"?

Сообщение  vbman в Сб Май 02, 2009 5:12 pm

Есть еще ее близнец, SetKeyboardState, котрый позволяет установить состояние клавиш по тому же массиву, но визуально, т. е. на клавиатуре, все остается как было (для КапсЛок, например, индикатор как не горел, так и не горит, хотя считается, что клавиша включена..., а при включении индикатора - выключается). Так можно со всей клавиатурой. Я над секретаршами так на работе прикалываюсь What a Face . По полдня выходит с умным видом кофе у них пить... И мне приятно, и начальство ценит... Но это плохой пример и не достоин подражания... Evil or Very Mad
avatar
vbman

Сообщения : 52
Дата регистрации : 2008-11-19
Возраст : 35
Откуда : Украина, Кировоград

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: Кто-нибудь работал с WinApi функцией "GetKeyboardState"?

Сообщение  Спонсируемый контент


Спонсируемый контент


Вернуться к началу Перейти вниз

Предыдущая тема Следующая тема Вернуться к началу

- Похожие темы

 
Права доступа к этому форуму:
Вы не можете отвечать на сообщения