用hook拦截键盘输入,怎么判断左右shift,ctrl?

stgsd 2004-07-20 02:30:20
如题,具体点
...全文
324 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
stgsd 2004-08-01
  • 打赏
  • 举报
回复
结果是这样:在hook拦下的参数中
左shift:lparam shr 16=42
右shift: lparam shr 16=54
如果是wparam都是16
搞了好久才搞出来,
linzhengqun 2004-07-24
  • 打赏
  • 举报
回复
如何判断左右Shift按键

procedure TForm1.WMKeyDown(var Message: TWMKey);
begin
inherited;
//判断按下
if ((message.KeyData) and ($2a shl 16))=($2a shl 16) then
showmessage('左 shift 按下')
else if ((message.KeyData) and ($36 shl 16))=($36 shl 16) then
showmessage('右 shift 按下');

end;


myy 2004-07-23
  • 打赏
  • 举报
回复
C++的例子,参考一下吧。

------------------------------

LRESULT LowLevelKeyboardProc(INT nCode, WPARAM wParam, LPARAM lParam)
{
static BOOL fShiftPressed = false;
bool fHandled = false;

if (nCode == HC_ACTION)
{
KBDLLHOOKSTRUCT *pkbdllhook = (KBDLLHOOKSTRUCT *)lParam;

switch (wParam)
{
case WM_SYSKEYDOWN:
switch (pkbdllhook->vkCode)
{
case VK_LSHIFT:
case VK_RSHIFT:
// 用户按下 Shift 键
fShiftPressed = true;
break;
case VK_TAB:
if (pkbdllhook->flags & LLKHF_ALTDOWN)
{
fHandled = true;
FmWin->Show();
}
break;
case VK_ESCAPE:
if (pkbdllhook->flags & LLKHF_ALTDOWN)
{
// 用户按下 Esc 键,关闭 AltTab 容器窗口
// 并且不切换到选定窗口
FmWin->Hide();
fHandled = true;
}
break;
}
break;
case WM_KEYUP:
case WM_SYSKEYUP:
switch (pkbdllhook->vkCode)
{
case VK_LMENU:
case VK_RMENU:
// 用户释放 Alt 键,关闭 AltTab 容器窗口
// 并切换到选定窗口
FmWin->Hide();
break;
case VK_LSHIFT:
case VK_RSHIFT:
// 用户释放 Shift 键
fShiftPressed = false;
break;
}
break;
}
}
return (fHandled ? true : CallNextHookEx(hhook, nCode, wParam, lParam));
}
stgsd 2004-07-23
  • 打赏
  • 举报
回复
可是不行啊,hook根本分不出来,谁知道怎么从lparam中读出左右shift的扫描码?
stgsd 2004-07-21
  • 打赏
  • 举报
回复
vk_lshift=160
vk_rshift=161
zhu0119121 2004-07-20
  • 打赏
  • 举报
回复
我也想知道
太好了
myy 2004-07-20
  • 打赏
  • 举报
回复
VK_LSHIFT , VK_RSHIFT
benjiamen 2004-07-20
  • 打赏
  • 举报
回复

判断shift,ctrl键是可以,但是是左是右我就不知了,以下是例子
iShift:=Getkeystate(vk_Shift);
iCaptial:=Getkeystate(vk_Capital);
iNumlock:=Getkeystate(vk_NumLock);
if (iShift and KeyPressMask)=KeyPressMask then
bShift:=True else bShift:=False;

是左是右如何获得,我也想知道.

ju1 2004-07-20
  • 打赏
  • 举报
回复
ascii码

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧