· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.WIN32 —› GetKeyboardState в 9x & Xp

Посл.отвђт Сообщенiе


Дата: Июл 28, 2004 16:08:08

Использую сабжевую функцию для определения нажатых CTRL, SHIFT, ALT, WIN, точнее LCTRL, RCTRL ну и так далее. В MSDN написано, что достаточно использовать VK_RCONTROL например и это работает в Хр, но НЕ работает в 98 и 95!!! хотя в документации про это ни слова...
В чем же на самом деле дело? Неточность в MSDN или другая бяка?
Подскажите, плиз как это исправить? Ну или хотябы почему так?


Дата: Июл 28, 2004 17:14:15

Покажи код.


Дата: Июл 28, 2004 19:32:33

; SendHotKey =================================
SendHotKey proc VK:dword, flag:dword ; return TRUE = processed or FALSE = not
invoke GetKeyboardState,addr bKeybState
xor ecx,ecx
.if bKeybState[VK_LCONTROL] & 80h ; verify the highest bit only (if 1 - key pressed)
or ecx,VKM_LCONTROL
.endif
.if bKeybState[VK_LSHIFT] & 80h
or ecx,VKM_LSHIFT
.endif
.if bKeybState[VK_LMENU] & 80h ; LEFT ALT
or ecx,VKM_LALT
.endif
.if bKeybState[VK_LWIN] & 80h
or ecx,VKM_LWIN
.endif
.if bKeybState[VK_RCONTROL] & 80h
or ecx,VKM_RCONTROL
.endif
.if bKeybState[VK_RSHIFT] & 80h
or ecx,VKM_RSHIFT
.endif
.if bKeybState[VK_RMENU] & 80h ; RIGHT ALT
or ecx,VKM_RALT
.endif
.if bKeybState[VK_RWIN] & 80h
or ecx,VKM_RWIN
.endif
mov edx,VK ; eax
or edx,ecx ; now edx has VK_KEY,Scancode & CTRL,SHIFT,ALT,WIN keys status
.if dl == VK_LCONTROL || dl == VK_LSHIFT || dl == VK_LMENU || dl == VK_LWIN || \
dl == VK_RCONTROL || dl == VK_RSHIFT || dl == VK_RMENU || dl == VK_RWIN || \
dl == VK_CONTROL || dl == VK_SHIFT || dl == VK_MENU
xor dl,dl ; 0 - skip modifiers
.endif
invoke SendMessage,hMainWnd,HKM_KBDHOOK,edx,flag
.if !eax ; verify window handle
invoke FindWindow,addr szMainClass,NULL
mov hMainWnd,eax
.endif
ret
SendHotKey endp

VKM_.... - собственные константы


Дата: Июл 28, 2004 22:11:02

lazari
Я спутал твою функцию с GetKeyState, после которой часто пытаются проверять DWORD хотя функция возвращает SHORT, распространенная ошибка, кстати у Iczelion'а тоже присутствует эта ошибка в одном из туторов :-)
Про GetKeyboardState ничего сказать не могу, ибо не применял никогда.


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.037