none
我发现winform中,窗体的消息队列函数中,鼠标不移动,也会产生鼠标移动消息也就是512,不知是和原因,求高人解答 RRS feed

  • 问题

  • 代码如下:

    重写窗体的WndProc事件,截获windows消息并处理,但是发现一个奇怪的现象,就是当鼠标没有移动的时候,也会产生鼠标移动消息512,不知是为何,求大神不吝赐教。

     protected override void WndProc(ref Message m)
            {
                if (m.Msg >= 512 && m.Msg <= 522)//截获所有鼠标事件消息
                {
                    //Console.WriteLine("当前鼠标Windows消息:" + m.Msg);
                    Point currP = Cursor.Position;
                    //Console.WriteLine(string.Format("currP的X值为:{0},Y的值为:{1}", currP.X, currP.Y));
                    //Console.WriteLine(string.Format("globalP的X值为:{0},Y的值为:{1}", globalP.X, globalP.Y));

                    Console.WriteLine("触发了鼠标系列事件{0}", m.Msg);
                    isShow = false;

                    if (m.Msg == 512)
                    {
                        if (globalP.X == -1 && globalP.Y == -1)
                        {
                            //表示首次进来为初始值时,不做判断,只赋值,便于下次判断
                            globalP = currP;
                        }
                        else
                        {
                            if ((globalP.X != currP.X) && (globalP.Y != currP.Y))
                            {
                                isShow = false; //return;
                            }
                            else
                            {
                                Console.WriteLine(string.Format("currP的X值为:{0},Y的值为:{1}", currP.X, currP.Y));
                                Console.WriteLine(string.Format("globalP的X值为:{0},Y的值为:{1}", globalP.X, globalP.Y));

                                //Console.WriteLine("512设置为true了======================================");
                                isShow = true; //return;
                            }
                        }
                    }
                   
                }
                else if (m.Msg == 0x0100 || m.Msg == 0x0101)//截获所有键盘事件消息 0x0100
                {
                    //Console.WriteLine("当前键盘Windows消息:" + m.Msg);
                    //this.Hide();
                    Console.WriteLine("触发了键盘系列事件{0}", m.Msg);
                    isShow = false;
                    //return;
                }
                //else { isShow = true; 
                    
                //    //Console.WriteLine("触发了其他系列事件{0}", m.Msg);
                //}

                base.WndProc(ref m);
            }

    <audio controls="controls" style="display:none;"></audio>

    2020年11月28日 9:31

全部回复

  • 你好,

    经过我的研究以及搜索,我重现了您的问题。

    目前的解释是鼠标移动已经在上一个窗口被检测到了,所以在下一个窗口即使不移动也会检测到这个鼠标移动。

    下面的文档详细的解释了这个问题,你可以看看。

    Why do I get spurious WM_MOUSEMOVE messages?

    当然,他最后的建议是在WM_MOUSEMOVE中添加一个检查,以确保鼠标位置与上一个WM_MOUSEMOVE消息报告的位置不同。

    Best Regards,

    Jack


    MSDN Community Support
    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2020年11月30日 8:35
    版主