Кто-нибудь работал с WinApi функцией "GetKeyboardState"?
Участников: 3
Страница 1 из 1
Кто-нибудь работал с WinApi функцией "GetKeyboardState"?
пытаюсь разобраться с этой функцией, почему-то не работает.
код:
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 я выгружал, все-равно выше преведенный код неработает.
код:
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- Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 43
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург
Re: Кто-нибудь работал с WinApi функцией "GetKeyboardState"?
Если честно, никогда с этой функцией не сталкивался. Посмотрел под отладчиком - массив вообще не изменяется после первого вызова. То есть на клавиатуру не реагирует.
А в документации написано:
А в документации написано:
Похоже, что эту функцию нельзя вызывать из приложений, не имеющих окон, а, значит, и циклов обработки сообщений. Придется опрашивать функциями вроде GetKeyState."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."
DiG. GeRR- Сообщения : 101
Дата регистрации : 2009-01-30
Возраст : 32
Откуда : Рудный, Казахстан
Re: Кто-нибудь работал с WinApi функцией "GetKeyboardState"?
ну microsoft! задолбали они с этими окнами, такая же ситуация с большинством голосовых движков под sapi4. ну не хотят они говорить в консольных окнах. про функцию GetKeyState, знаю, спасибо, придеться работать с ней. впринципе я уже пробовал, но не обрабатывал несколько подрят нажатых клавиш. убить их этих мелкомягких надо!
впринципе, можно создать любое gui окно, и его не показывать, ладно, будем мудрить.
впринципе, можно создать любое gui окно, и его не показывать, ладно, будем мудрить.
electrik- Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 43
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург
Re: Кто-нибудь работал с WinApi функцией "GetKeyboardState"?
ну вот таким способом, можно работать с клавиатурой в консоли, через 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
код:
#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- Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 43
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург
Re: Кто-нибудь работал с WinApi функцией "GetKeyboardState"?
Есть еще ее близнец, SetKeyboardState, котрый позволяет установить состояние клавиш по тому же массиву, но визуально, т. е. на клавиатуре, все остается как было (для КапсЛок, например, индикатор как не горел, так и не горит, хотя считается, что клавиша включена..., а при включении индикатора - выключается). Так можно со всей клавиатурой. Я над секретаршами так на работе прикалываюсь . По полдня выходит с умным видом кофе у них пить... И мне приятно, и начальство ценит... Но это плохой пример и не достоин подражания...
vbman- Сообщения : 52
Дата регистрации : 2008-11-19
Возраст : 42
Откуда : Украина, Кировоград
Страница 1 из 1
Права доступа к этому форуму:
Вы не можете отвечать на сообщения
|
|