键盘钩子中的一些常用参数转换
来源:互联网 发布:刺客聂隐娘影评 知乎 编辑:程序博客网 时间:2024/06/08 06:52
得到当前哪个键被按下,返回按键的name
for(int i=0;i<=255;++i)
{
if( GetKeyState(i) & 0x80000000 )
{
TCHAR str[256];
memset(str,0,256*sizeof(TCHAR));
GetKeyNameText((MapVirtualKey(i,0)<<16)+1,str,256);
}
函数结果:如果A键被按下,返回一个字符‘A’
转换当前的键盘消息,得到是哪个字符键被按下
ToAscii(keyWParam,HIWORD(keyLParam), m_KeybdData, &dwKey, 0) ;
keyWparam 和 lParam 为keydown时的按键消息的wParam,lParam, m_KeybdData为一个256的键盘缓冲区,使用GetKeyboradState得到,函数结果:如果A键被按下,将会返回‘A’的ASCII值,可以通过m_KeybdData区分大小写的。
低级钩子到普通钩子的键盘参数转换:
KBDLLHOOKSTRUCT *pkbdllHook = (KBDLLHOOKSTRUCT*)lParam;
WPARAM keyWParam = pkbdllHook->vkCode;
LPARAM keyLParam = pkbdllHook->scanCode;
keyLParam = keyLParam << 16;
keyLParam |= 0x1;
if(pkbdllHook->flags & 0x01)
keyLParam |= 0x1000000;
if(pkbdllHook->flags & 0x20)
keyLParam |= 0x20000000;
if(pkbdllHook->flags & 0x80)
keyLParam |= 0xc0000000;
if(keyWParam == VK_LSHIFT || keyWParam == VK_RSHIFT)
keyWParam = VK_SHIFT;
else if(keyWParam == VK_LCONTROL || keyWParam == VK_RCONTROL)
keyWParam == VK_CONTROL;
在低级钩子的处理过程中,使用AsyncGetKeyState会失败,使用GetKeyState在键盘按键释放时处理过程中也会得到值,这一点与在其它的处理过程中得到的不一样的,例如IME的ProcessChar中使用GetKeyState在按键释放时得到的是空值,但是在低级钩子的处理过程中会得到正确的值。
这说明低级钩子如果处理过程函数不返回,键盘的状态会保持为处理前的状态,使用的GetKeyStae返回值证实了这点.
在低级钩子中使用GetKeyboardState也会失败,应该判断hook函数里的wParam,为WM_KEYDOWN时将相应的值设为80,为WM_KEYUP时设为0,如果程序要处理VK_SHIFT,VK_CTRL,应该判断pkbdllHook->vkCode,在VK_LSHIFT、VK_RSHIFT时将VK_SHIFT的值设置,因为vcCode传的值是区分左右SHIFT的,而普通的KEYDOWN是不会区分此值。
获取大小写转换键的状态,
if( GetKeyState(VK_CAPITAL) & 1)
m_KeybdData[VK_CAPITAL] = 1;
else
m_KeybdData[VK_CAPITAL] = 0;
- 键盘钩子中的一些常用参数转换
- 低级键盘钩子到普通DLL钩子的参数转换
- Windows Mobile 中的键盘钩子实战
- 鼠标钩子 键盘钩子
- 键盘钩子
- 键盘钩子
- 键盘钩子
- 键盘钩子
- 键盘钩子
- 键盘钩子
- 键盘钩子
- 键盘钩子
- 键盘钩子
- 键盘钩子
- 键盘钩子
- 键盘钩子
- 键盘钩子
- 键盘钩子回调函数中的lParam & 0x80000000
- 链接器 如何链接同名符号 规则
- VC中简单操作注册表
- 了解分布式数据库系统优势与劣势(转)
- Red Hat:软件专利阻碍创新 申请用于自卫
- System.Net.Dns的型別初始設定式發生例外狀況
- 键盘钩子中的一些常用参数转换
- 披着羊皮的狼
- 创建子进程
- Windows平台的ruby IDE 点评
- asp数据库的备份与恢复
- MVC
- struts中action,公共接口,工厂,实现类(执行类)之间的关系
- ASP中巧用Response存取文件
- 转载*这就是我的第一次感情经历,很苦