社区
C#
帖子详情
快捷键问题
ar_yang
2003-01-22 01:43:26
怎样判断组合键?
(从Message结构)
...全文
38
31
打赏
收藏
快捷键问题
怎样判断组合键? (从Message结构)
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
31 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
ar_yang
2003-02-13
打赏
举报
回复
问题转移至:
http://expert.csdn.net/Expert/topic/1423/1423672.xml?temp=.4679682
结贴!
ar_yang
2003-02-13
打赏
举报
回复
我现在找不到什么方法可以去补充这个笨蛋Message, :( ......555555555
咦,是不是跑题了?
再去开一贴!
多谢李晋兄!多多多多多多多多多多多多多多多多多多多多谢!!!
HellMaster
2003-02-13
打赏
举报
回复
这就是刚才说的:Message只能存储单键的信息
如何让“Ctrl+A”消息正确地传递下去
给你一点思路,你可以去试一下:
你在MessageBox弹出以前,用一个变量存储“Ctrl+A”的状态,然后在MessageBox弹出以后,需要的地方,用这个变量即可。
ar_yang
2003-02-13
打赏
举报
回复
我还有一点不明白:
在PreFilterMessage函数中,我得到了Ctrl+A的消息,我可以用你的方法判断出来,然后作一些处理,处理完成后需要把消息继续传递下去。可是,如果在我的处理过程中弹出了一个MessageBox或者其他的Model Window,则传递下去的只是一个单键A的信息;而如果没有这些弹出框,则传递下去的是Ctrl+A消息。
这是为什么?
如果一定会有MessageBox弹出,那么我该如何让这个“Ctrl+A”消息正确传递下去?
HellMaster
2003-02-13
打赏
举报
回复
Message只能存储单键的信息,
所以要判断组合键的状态,必须得借助static型的变量(当然,你也可以把它存到别的地方去)
你不能只判断WParam的值,也得判断LParam,因为按下或松开某一个键的时候,触发的Message中WParam是一样的,以Ctrl键来说吧,你按下Ctrl键和松开都会触发WParam=65的消息,所以我用
if (((uint)m.LParam & 0x80000000) == 0)
判断键是否已被按下,
所以,你说的“如果我先按下了Ctrl,然后松开,然后再去按下A,那么得到的结论也是CtrlA”是不成立的。
第二种方法用GetAsyncKeyState判断整个系统范围内的虚拟键的状态,和Message并没有直接的关系,只是系统触发Message的时候进行一下判断而已。
举个例子:在我的一个程序中(PB),我是用一个Timer,每0.01s用GetAsyncKeyState判断一次组合键的状态,用以确定快捷键
DannyChen
2003-02-13
打赏
举报
回复
studying...
ar_yang
2003-02-13
打赏
举报
回复
谢谢李兄,其实你的代码我在年前就已经试过了,只是一直还有疑惑,还请多指教!
ar_yang
2003-02-13
打赏
举报
回复
这就相当于按下Ctrl+A时得到了两个消息,对吧?
而且对于第一个方法,如果我先按下了Ctrl,然后松开,然后再去按下A,那么得到的结论也是CtrlA,这就不正确了,是这样么?
另外,我想确认一下:
第二种方法得到的状态不是从Message里面来的,对吧?
那么是不是可以认为:Message无法储存组合键的信息?
如果这个PreFilterMessage要求把消息传递下去的话,是不是只是有一个单键的信息了?
HellMaster
2003-02-13
打赏
举报
回复
你把我的代码粘贴过去试一试就知道没问题的了
HellMaster
2003-02-13
打赏
举报
回复
没错
这就室我在第一种方法中用static型的变量的原因
第二种方法就没有这个问题了
ar_yang
2003-02-13
打赏
举报
回复
哦,我的意思是说,在你的第一个方法里面的连续的3个if判断,只有可能有一个是成立的,那么就判断不出组合键了呀?
ar_yang
2003-02-13
打赏
举报
回复
欢迎李晋兄回来!
可是我还是不明白,在我的这个消息里,m.WParam只能等于一个值吧?
那么(m.WParam==17 & m.WParam==65)是永远不会成立的了?
另外,我觉得GetAsyncKeyState是不是直接从系统里面取按键的状态,而不是从我的Message里面?
HellMaster
2003-02-12
打赏
举报
回复
可是当我同时按下Ctrl+A时,难道m.WParam即等于17,又等于65吗?
这怎么可能?
说的没错
就因为这样不可能
所以才这么麻烦
不过你并没有仔细地看我上面的代码
如果是“m.WParam即等于17,又等于65”的话,用一个
(m.WParam==17 & m.WParam==65)
岂不就完事了!
sarmoo
2003-02-08
打赏
举报
回复
仅供参考:http://www.syncfusion.com/FAQ/WinForms/FAQ_c46c.asp
ar_yang
2003-01-27
打赏
举报
回复
可是当我同时按下Ctrl+A时,难道m.WParam即等于17,又等于65吗?
这怎么可能?
ar_yang
2003-01-24
打赏
举报
回复
谢谢!百忙之中还能来帮我!
HellMaster
2003-01-24
打赏
举报
回复
想不到今天还有一点时间(半个小时)
给你看一下:
第一种方法:通过。
static bool AStat=false;
static bool CtrlStat=false;
static bool AltStat=false;
public clsHold()
{
//
// TODO: 在此处添加构造函数逻辑
//
}
public bool PreFilterMessage(ref Message m)
{
bool rtnValue=false;
try
{
if (m.WParam==(IntPtr)65) //A键的状态
if (((uint)m.LParam & 0x80000000) == 0) AStat=true;
else AStat=false;
if (m.WParam==(IntPtr)17) //Ctrl键的状态
if (((uint)m.LParam & 0x80000000) == 0) CtrlStat=true;
else CtrlStat=false;
if (m.WParam==(IntPtr)18) //Alt键的状态
if (((uint)m.LParam & 0x80000000) == 0) AltStat=true;
else AltStat=false;
if (AStat & CtrlStat & AltStat)
Form.ActiveForm.Text="true";
else
Form.ActiveForm.Text="false";
第二种方法:也通过,没有你说的问题
bool AStat=false;
bool CtrlStat=false;
bool AltStat=false;
AStat=(GetAsyncKeyState(65)!=0);
CtrlStat=(GetAsyncKeyState(17)!=0);
AltStat=(GetAsyncKeyState(18)!=0);
if (AStat & CtrlStat & AltStat)
Form.ActiveForm.Text="hi";
else
Form.ActiveForm.Text="no";
ar_yang
2003-01-24
打赏
举报
回复
啊,你不要走!! 呵呵!
过个好年!!
我还得想 想 想!
然后try try try!
ar_yang
2003-01-23
打赏
举报
回复
就是我现在得到了一个Message结构的消息,它里面有几个参数例如wParam……
我想要知道这个消息的含义。
如果是键盘被按下的消息,那我想知道它按下的是哪个或哪几个键?
这样说明白吗?
maotin
2003-01-23
打赏
举报
回复
什么意思?在清楚一点~~
加载更多回复(11)
Eclipse
快捷键
Eclipse
快捷键
Eclipse
快捷键
Eclipse
快捷键
Eclipse
快捷键
Eclipse
快捷键
解决华硕笔记本重装win10无背景灯
快捷键
问题
解决华硕笔记本重装win10无背景灯
快捷键
问题
之前笔记本从Linux平台重装回windows10,但是发现背景灯
快捷键
没有了。 某乎说是缺少华硕官方的驱动,重新去华硕官网下载了重装
问题
解决。 型号:U4000UQ 网址:...
windows 关闭粘滞键-解决Microsoft Remote Desktop输入自动变为
快捷键
问题
我用 mac 连接 windows 电脑用的 Microsoft Remote Desktop 工具,发现经常输入文本时,输入的字母变成
快捷键
了,要按一下 command 才能解决。 我把粘滞键这个功能关掉了,发现情况好了很多,但是偶尔还会有这种
问题
...
idea中 ctrl+k
快捷键
问题
今天使用idea写程序的时候,突然发现使用ctrl+k查找下一个关键词时出现
问题
,具体表现为:选定某关键词后使用ctrl+k,查找的是上一次查询的关键词。我的idea已经设置了和eclipse一样的
快捷键
,ctrl+k在eclipse中使用...
QtCreator
快捷键
问题
记录
在QtCreator ->Options->Environment->Keyboard中可以找到所有的
快捷键
,根据自己的需求搜索。否则不点击这个Record,然后输入是无效的。这个可以设置成自己想要的任意
快捷键
,我是设置成了Command+Shift+E。...
C#
110,539
社区成员
642,577
社区内容
发帖
与我相关
我的任务
C#
.NET技术 C#
复制链接
扫一扫
分享
社区描述
.NET技术 C#
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
让您成为最强悍的C#开发者
试试用AI创作助手写篇文章吧
+ 用AI写文章