快捷键问题 http://expert.csdn.net/Expert/topic/1335/1335441.xml?temp=.3631403 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 对不起没说清楚,是系统给我一个Message消息,我怎么判断出是否是按下了哪个键或组合键? 就是我现在得到了一个Message结构的消息,它里面有几个参数例如wParam……我想要知道这个消息的含义。如果是键盘被按下的消息,那我想知道它按下的是哪个或哪几个键?这样说明白吗? http://expert.csdn.net/Expert/topic/1376/1376342.xml?temp=.5640375 可是如果同时按下了Ctrl+Alt+A,也这么判断吗?我怎么有点不大明白? 如果同时按下了Ctrl+Alt+A,这么写吗?[DllImport("user32")]public static extern int GetAsyncKeyState (int vKey);bool ShiftStat=false;bool AltStat=false;bool CtrlStat=false;ShiftStat=(GetAsyncKeyState(16)!=0);CtrlStat=(GetAsyncKeyState(17)!=0);AltStat=(GetAsyncKeyState(18)!=0);if (ShiftStat & CtrlStat && (m.WParam==(IntPtr)65))MessageBox.Show("A+Ctrl+Alt");可是如果按下的是Ctrl+A,这个if也成立呀,这就分辨不出乐! if (ShiftStat & CtrlStat && (m.WParam==(IntPtr)65))===》if (ShiftStat & CtrlStat & (m.WParam==(IntPtr)65)) 啊,你不要走!! 呵呵!过个好年!!我还得想 想 想!然后try try try! 想不到今天还有一点时间(半个小时)给你看一下:第一种方法:通过。 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"; 可是当我同时按下Ctrl+A时,难道m.WParam即等于17,又等于65吗?这怎么可能? 仅供参考:http://www.syncfusion.com/FAQ/WinForms/FAQ_c46c.asp 可是当我同时按下Ctrl+A时,难道m.WParam即等于17,又等于65吗?这怎么可能?说的没错就因为这样不可能所以才这么麻烦不过你并没有仔细地看我上面的代码如果是“m.WParam即等于17,又等于65”的话,用一个 (m.WParam==17 & m.WParam==65)岂不就完事了! 欢迎李晋兄回来!可是我还是不明白,在我的这个消息里,m.WParam只能等于一个值吧?那么(m.WParam==17 & m.WParam==65)是永远不会成立的了?另外,我觉得GetAsyncKeyState是不是直接从系统里面取按键的状态,而不是从我的Message里面? 没错这就室我在第一种方法中用static型的变量的原因第二种方法就没有这个问题了 这就相当于按下Ctrl+A时得到了两个消息,对吧?而且对于第一个方法,如果我先按下了Ctrl,然后松开,然后再去按下A,那么得到的结论也是CtrlA,这就不正确了,是这样么?另外,我想确认一下:第二种方法得到的状态不是从Message里面来的,对吧?那么是不是可以认为:Message无法储存组合键的信息?如果这个PreFilterMessage要求把消息传递下去的话,是不是只是有一个单键的信息了? 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判断一次组合键的状态,用以确定快捷键 我还有一点不明白:在PreFilterMessage函数中,我得到了Ctrl+A的消息,我可以用你的方法判断出来,然后作一些处理,处理完成后需要把消息继续传递下去。可是,如果在我的处理过程中弹出了一个MessageBox或者其他的Model Window,则传递下去的只是一个单键A的信息;而如果没有这些弹出框,则传递下去的是Ctrl+A消息。这是为什么?如果一定会有MessageBox弹出,那么我该如何让这个“Ctrl+A”消息正确传递下去? 这就是刚才说的:Message只能存储单键的信息如何让“Ctrl+A”消息正确地传递下去给你一点思路,你可以去试一下:你在MessageBox弹出以前,用一个变量存储“Ctrl+A”的状态,然后在MessageBox弹出以后,需要的地方,用这个变量即可。 我现在找不到什么方法可以去补充这个笨蛋Message, :( ......555555555咦,是不是跑题了?再去开一贴!多谢李晋兄!多多多多多多多多多多多多多多多多多多多多谢!!! 问题转移至:http://expert.csdn.net/Expert/topic/1423/1423672.xml?temp=.4679682结贴! 使用Jmail组件为什么不能连接到gmail邮箱 如何实现Excel自动Ctrl+F的功能 c#求二维数组中最大元素及其所在的行和列 image.clone NHibernte如何共享session 存储过程参数出错问题 如何引用 请指教! 小弟做的论坛,上传头像提示要输入网络密码,这个是怎么回事啊?要怎么解决?钱不多笑纳 主从表的新增记录问题,大家帮忙: datagridview刷新问题,请高手们帮个忙 如何在C#中执行JS文件,输出执行结果 关于datagrid DataGrid属性生成器中的超级链接列的Url字段可以有多个吗?
我想要知道这个消息的含义。
如果是键盘被按下的消息,那我想知道它按下的是哪个或哪几个键?
这样说明白吗?
我怎么有点不大明白?
[DllImport("user32")]
public static extern int GetAsyncKeyState (int vKey);bool ShiftStat=false;
bool AltStat=false;
bool CtrlStat=false;ShiftStat=(GetAsyncKeyState(16)!=0);
CtrlStat=(GetAsyncKeyState(17)!=0);
AltStat=(GetAsyncKeyState(18)!=0);
if (ShiftStat & CtrlStat && (m.WParam==(IntPtr)65))
MessageBox.Show("A+Ctrl+Alt");
可是如果按下的是Ctrl+A,这个if也成立呀,这就分辨不出乐!
===》
if (ShiftStat & CtrlStat & (m.WParam==(IntPtr)65))
过个好年!!我还得想 想 想!
然后try try try!
给你看一下:第一种方法:通过。 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";
这怎么可能?
这怎么可能?说的没错
就因为这样不可能
所以才这么麻烦不过你并没有仔细地看我上面的代码如果是“m.WParam即等于17,又等于65”的话,用一个
(m.WParam==17 & m.WParam==65)
岂不就完事了!
那么(m.WParam==17 & m.WParam==65)是永远不会成立的了?另外,我觉得GetAsyncKeyState是不是直接从系统里面取按键的状态,而不是从我的Message里面?
这就室我在第一种方法中用static型的变量的原因第二种方法就没有这个问题了
而且对于第一个方法,如果我先按下了Ctrl,然后松开,然后再去按下A,那么得到的结论也是CtrlA,这就不正确了,是这样么?另外,我想确认一下:
第二种方法得到的状态不是从Message里面来的,对吧?
那么是不是可以认为:Message无法储存组合键的信息?
如果这个PreFilterMessage要求把消息传递下去的话,是不是只是有一个单键的信息了?
所以要判断组合键的状态,必须得借助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判断一次组合键的状态,用以确定快捷键
在PreFilterMessage函数中,我得到了Ctrl+A的消息,我可以用你的方法判断出来,然后作一些处理,处理完成后需要把消息继续传递下去。可是,如果在我的处理过程中弹出了一个MessageBox或者其他的Model Window,则传递下去的只是一个单键A的信息;而如果没有这些弹出框,则传递下去的是Ctrl+A消息。
这是为什么?
如果一定会有MessageBox弹出,那么我该如何让这个“Ctrl+A”消息正确传递下去?
给你一点思路,你可以去试一下:
你在MessageBox弹出以前,用一个变量存储“Ctrl+A”的状态,然后在MessageBox弹出以后,需要的地方,用这个变量即可。
再去开一贴!多谢李晋兄!多多多多多多多多多多多多多多多多多多多多谢!!!
http://expert.csdn.net/Expert/topic/1423/1423672.xml?temp=.4679682结贴!