http://expert.csdn.net/Expert/topic/1335/1335441.xml?temp=.3631403

解决方案 »

  1.   

    对不起没说清楚,是系统给我一个Message消息,我怎么判断出是否是按下了哪个键或组合键?
      

  2.   

    就是我现在得到了一个Message结构的消息,它里面有几个参数例如wParam……
    我想要知道这个消息的含义。
    如果是键盘被按下的消息,那我想知道它按下的是哪个或哪几个键?
    这样说明白吗?
      

  3.   

    http://expert.csdn.net/Expert/topic/1376/1376342.xml?temp=.5640375
      

  4.   

    可是如果同时按下了Ctrl+Alt+A,也这么判断吗?
    我怎么有点不大明白?
      

  5.   

    如果同时按下了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也成立呀,这就分辨不出乐!
      

  6.   

    if (ShiftStat & CtrlStat && (m.WParam==(IntPtr)65))
    ===》
    if (ShiftStat & CtrlStat & (m.WParam==(IntPtr)65))
      

  7.   

    啊,你不要走!!   呵呵!
    过个好年!!我还得想 想 想!
    然后try try try!
      

  8.   

    想不到今天还有一点时间(半个小时)
    给你看一下:第一种方法:通过。 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";
      

  9.   

    可是当我同时按下Ctrl+A时,难道m.WParam即等于17,又等于65吗?
    这怎么可能?
      

  10.   

    仅供参考:http://www.syncfusion.com/FAQ/WinForms/FAQ_c46c.asp
      

  11.   

    可是当我同时按下Ctrl+A时,难道m.WParam即等于17,又等于65吗?
    这怎么可能?说的没错
    就因为这样不可能
    所以才这么麻烦不过你并没有仔细地看我上面的代码如果是“m.WParam即等于17,又等于65”的话,用一个
     (m.WParam==17 & m.WParam==65)
    岂不就完事了!
      

  12.   

    欢迎李晋兄回来!可是我还是不明白,在我的这个消息里,m.WParam只能等于一个值吧?
    那么(m.WParam==17 & m.WParam==65)是永远不会成立的了?另外,我觉得GetAsyncKeyState是不是直接从系统里面取按键的状态,而不是从我的Message里面?
      

  13.   

    没错
    这就室我在第一种方法中用static型的变量的原因第二种方法就没有这个问题了
      

  14.   

    这就相当于按下Ctrl+A时得到了两个消息,对吧?
    而且对于第一个方法,如果我先按下了Ctrl,然后松开,然后再去按下A,那么得到的结论也是CtrlA,这就不正确了,是这样么?另外,我想确认一下:
    第二种方法得到的状态不是从Message里面来的,对吧?
    那么是不是可以认为:Message无法储存组合键的信息?
    如果这个PreFilterMessage要求把消息传递下去的话,是不是只是有一个单键的信息了?
      

  15.   

    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判断一次组合键的状态,用以确定快捷键
      

  16.   

    我还有一点不明白:
    在PreFilterMessage函数中,我得到了Ctrl+A的消息,我可以用你的方法判断出来,然后作一些处理,处理完成后需要把消息继续传递下去。可是,如果在我的处理过程中弹出了一个MessageBox或者其他的Model Window,则传递下去的只是一个单键A的信息;而如果没有这些弹出框,则传递下去的是Ctrl+A消息。
    这是为什么?
    如果一定会有MessageBox弹出,那么我该如何让这个“Ctrl+A”消息正确传递下去?
      

  17.   

    这就是刚才说的:Message只能存储单键的信息如何让“Ctrl+A”消息正确地传递下去
    给你一点思路,你可以去试一下:
    你在MessageBox弹出以前,用一个变量存储“Ctrl+A”的状态,然后在MessageBox弹出以后,需要的地方,用这个变量即可。
      

  18.   

    我现在找不到什么方法可以去补充这个笨蛋Message, :( ......555555555咦,是不是跑题了?
    再去开一贴!多谢李晋兄!多多多多多多多多多多多多多多多多多多多多谢!!!
      

  19.   

    问题转移至:
    http://expert.csdn.net/Expert/topic/1423/1423672.xml?temp=.4679682结贴!