键盘钩子有个地方不太懂《Windows环境下32位汇编语言程序设计》中钩子的一个例子:Assembly code
键盘钩子有个地方不太懂
《Windows环境下32位汇编语言程序设计》中钩子的一个例子:
Assembly code;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>; 键盘钩子回调函数;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>HookProc proc _dwCode,_wParam,_lParam local @szKeyState[256]:byte invoke CallNextHookEx,hHook,_dwCode,_wParam,_lParam invoke GetKeyboardState,addr @szKeyState invoke GetKeyState,VK_SHIFT mov @szKeyState + VK_SHIFT,al mov ecx,_lParam shr ecx,16 invoke ToAscii,_wParam,ecx,addr @szKeyState,addr szAscii,0 mov byte ptr szAscii [eax],0 invoke SendMessage,hWnd,dwMessage,dword ptr szAscii,NULL xor eax,eax retHookProc endp
其中GetKeyState,VK_SHIFT
mov @szKeyState+VK_SHIFT,al
这两句我不是很懂,首先,根据GetKeyState的说明,好像返回值需要2个字节,也就是说,需要2个字节才能描述一个键的状态,但是GetKeyboardState每个键只用一个字节来说明状态,到底这一个字节是怎么描述按键状态的呢?我在MSDN上居然没找到
另外,GetKeyboardState不返回VK_SHIFT的状态吗?他不是返回256个按键的状态吗,怎么有的返回有的还不返回呢,还要自己去GetKeyState,书上说GetKeyboardState返回VK_LSHIFT和VK_RSHIFT的状态,它就不能顺便把VK_SHIFT的状态也返回了?
[解决办法]Windows API 封装了好多东西,如果你有兴趣,自己反汇编 Windows内核吧
[解决办法]GetKeyState function
...
...
...
Return value
Type: SHORT
The return value specifies the status of the specified virtual key, as follows:
If the high-order bit is 1, the key is down; otherwise, it is up.
If the low-order bit is 1, the key is toggled. The key is off and untoggled if the low-order bit is 0.
所以这里只用al就可以