所以我遇到了一个非常奇怪的错误/计时问题,因此我简化了以下代码以准确显示正在发生的事情。它在调试步进过程中非常有效,但是在没有断点的情况下做了一些奇怪的事情。
在我的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。
答案 0 :(得分:6)
m.LParam.ToInt32() == 2504
表示在任务栏中单击了该程序。
我不知道你为什么这么想,或者你得到了神奇的数字2504。
如果
wParam
参数为TRUE
,则lParam
是拥有正在停用的窗口的线程的标识符。如果wParam
为FALSE
,则lParam
是拥有正在激活的窗口的线程的标识符。
每次运行程序时,线程标识符都会发生变化,因此您根本看不到这个数字就不足为奇了。
如果您问的是如何收到的信息多于点击次数,那是因为WM_ACTIVATEAPP
的来来去去。你忽略了wParam
,这可以让你分辨出来。
如果您想知道为什么断点会改变行为,那是因为lParam
依赖于“另一个窗口”。断点会导致调试器窗口被激活,因此接收焦点的窗口序列会发生变化。