WndProc覆盖不一致地捕获消息C#

时间:2015-02-12 15:12:14

标签: c# wndproc

所以我遇到了一个非常奇怪的错误/计时问题,因此我简化了以下代码以准确显示正在发生的事情。它在调试步进过程中非常有效,但是在没有断点的情况下做了一些奇怪的事情。

在我的MainForm中,我正在捕捉任务栏点击次数

    const int WM_ACTIVATEAPP = 0x1C; 
    int count = 0;
    protected override void WndProc(ref Message m)
    {
     if (m.Msg == WM_ACTIVATEAPP)
        {
         if (m.LParam.ToInt32() == 2504)
            {
               using (StreamWriter writer = new StreamWriter("C:\\log.txt", true))
                {
                    count++;
                    writer.WriteLine(count);
                }
            }
        }
     }

m.LParam.ToInt32()== 2504表示在任务栏中单击了该程序。

如果我在“使用(StreamWriter ......”)上设置断点,运行调试并单击10次(每次编译后必须使用f5),我将在日志中显示1-10。

如果我取下断点并且每隔几秒钟单击一次,总共10次(与上面相同),我最终得到的是1-2,1-4,但是从来没有。

没有断点和10次快速双击,每次都会记录1-20。

1 个答案:

答案 0 :(得分:6)

  

m.LParam.ToInt32() == 2504表示在任务栏中单击了该程序。

我不知道你为什么这么想,或者你得到了神奇的数字2504。

What MSDN actually says

  

如果wParam参数为TRUE,则lParam是拥有正在停用的窗口的线程的标识符。如果wParamFALSE,则lParam是拥有正在激活的窗口的线程的标识符。

每次运行程序时,线程标识符都会发生变化,因此您根本看不到这个数字就不足为奇了。


如果您问的是如何收到的信息多于点击次数,那是因为WM_ACTIVATEAPP的来来去去。你忽略了wParam,这可以让你分辨出来。

如果您想知道为什么断点会改变行为,那是因为lParam依赖于“另一个窗口”。断点会导致调试器窗口被激活,因此接收焦点的窗口序列会发生变化。