WM_SYSKEYUP 的lParam,我做实验的结果为什么和msdn上讲的不一样?

BeRoy 2005-01-02 06:24:12
lParam
Specifies the repeat count, scan code, extended-key flag, context code, previous key-state flag, and transition-state flag, as shown in the following list of values.

30
Specifies the previous key state. The value is always 1 for a WM_SYSKEYUP message.
31
Specifies the transition state. The value is always 1 for a WM_SYSKEYUP message.
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
//重载 WndProc
void __fastcall TRecvForm::WndProc(TMessage &Msg)
{
//对alt+a测试
/* 如果alt +a被注册为热键
if(Msg.Msg==WM_HOTKEY){

if(LOWORD(Msg.LParam)==MOD_ALT && HIWORD(Msg.LParam)==0x41)
{
RecvForm->Label1->Caption="U Pressed 'ALT+A'(热键) ["+AnsiString(flag)+"]";
flag++;
}
}
*/
if(Msg.Msg==WM_SYSKEYUP){

WORD wModifier = LOWORD(Msg.LParam);
if(Msg.WParam==0x41)
{
if(wModifier==3){
RecvForm->Label2->Caption="'ALT+A'(因为没有键盘焦点WM_SYSKEYDOWN\n被发送到当前活动窗口) ["+AnsiString(flag2)+"]";
flag2++;
}
if(wModifier==7){
RecvForm->Label3->Caption="'ALT+A' (松开a时alt未松开)["+AnsiString(flag3)+"]";
flag3++;
}
if(wModifier==1){
RecvForm->Label4->Caption="'ALT+A' (lParam低16位值居然为1!不是\nMSND上说的最小也是3!)["+AnsiString(flag4)+"]";
flag4++;
}
}
}
RecvForm->Dispatch(&Msg);
}

//----------------------------------------------------
我在调试的时候,为什么每次我按alt+a都是进入if(wModifier==1)里面?msdn上说对于WM_SYSKEYUP的lparam最后2位都应该是1。那就应该是进入if(wModifier==3)里才对啊。
...全文
127 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
BeRoy 2005-01-13
  • 打赏
  • 举报
回复
呵呵,真是好老师。
因为一个窗口上如果有菜单比如“关于(A)”,alt+a就会激活他。想看如果我把alt+a组册为热键会怎么样。
结果系统系统只处理热键消息。看来是热键消息处理后,着个消息就从队列里移走了吧。
我看那个lparam参数挺复杂的,所以就测试一下他的值。

原来我把高位与低位弄反了。也就是把lapram的右边16位当成高位了。怪不得老是1,嘿嘿。。。
jishiping 2005-01-12
  • 打赏
  • 举报
回复
不知道楼主的目的是什么?
jishiping 2005-01-12
  • 打赏
  • 举报
回复
“为什么说alt+a 是热键呢?”
------------------------------------------------------------
这个还问我,你自己一开始都已经说了“如果alt +a被注册为热键”,所以说“alt+a 是热键”

如果 Alt+A 没有被注册为热键,那么按下Alt+A就会触发WM_SYSKEYDOWN消息,再松开A键就会
触发WM_SYSKEYUP消息。但是一旦Alt+A已经注册为热键,竹筏的就是WM_HOTKEY消息,而不再是
WM_SYSKEYDOWN或者WM_SYSKEYUP消息了。

无法直接判断一个键组合是不是已经被注册为热键了。唯一的办法,就是自己调用API函数
RegisterHotKey去测试键组合,如果注册成功(需要立刻调用UnregisterHotKey注销),说明
键组合在调用RegisterHotKey前还没有被注册为热键。
BeRoy 2005-01-12
  • 打赏
  • 举报
回复
在问问季大,为什么说alt+a 是热键呢?热键和syskey有什么区别啊。怎么判断一个键组合是不是热键呢?
BeRoy 2005-01-12
  • 打赏
  • 举报
回复
十分,非常,万分感谢!

我还是要测试以下再结贴 :)
jishiping 2005-01-11
  • 打赏
  • 举报
回复
楼主有太多概念不清。
1、你这儿是WM_HOTKEY,而不是WM_SYSKEYUP消息,不同的消息,消息的参数具有不同的意义。
对于WM_HOTKEY消息,LOWORD(lParam)是修饰符,指是否按下了特殊按键,如Alt、Ctrl、S
hift、WIN 等键是否按下。你这儿只是Alt键被按下,所以LOWORD(Msg.LParam)为1
2、即使是WM_SYSKEYUP消息,你贴的那段文字,指的是最高2位,而不是最低2位。也就是
(Msg.LParam>>30)&0x03 为3,而不是LOWORD(Msg.LParam)为3,LOWORD(Msg.LParam)表示键
被连续按下的次数。
BeRoy 2005-01-11
  • 打赏
  • 举报
回复
没人感兴趣?没人愿意试试吗?
3996906 2005-01-10
  • 打赏
  • 举报
回复
我也up~~~~~~~~~~这个麻烦点,可惜没时间试,听讲好了
BeRoy 2005-01-09
  • 打赏
  • 举报
回复
我up~~~~!!!

1,221

社区成员

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

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