快捷键问题

ar_yang 2003-01-22 01:43:26
怎样判断组合键?
(从Message结构)
...全文
38 31 打赏 收藏 转发到动态 举报
写回复
用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)

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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