什么是Windows消息0x02c8和0x02c9?

时间:2017-11-21 08:51:41

标签: c# winforms windows-messages

我有一个winforms应用程序,可以在连接到工业机器的PC上运行。通过显示频道切换设备和USB输入切换设备连接多台计算机。这意味着计算机在没有连接屏幕或任何输入设备的情况下启动。

我们遇到的问题是托管的WPF组件。在连接触摸设备之前初始化该组件。连接触摸设备后,除了WPF组件(它响应普通鼠标)外,一切都可以控制。

因此解决方案似乎很简单,在连接触摸设备后重新初始化WPF组件。所以我们尝试覆盖下面的WndProc方法。使用pinvoke.net中的WindowsMessage枚举。

protected override void WndProc(ref Message m)
{
    DateTime currentTime = DateTime.Now;
    Console.WriteLine($"#{currentTime.Minute}:{currentTime.Second}.{currentTime.Millisecond} WndProc: {m.Msg} ==> {(WindowsMessage)m.Msg}");
    Console.WriteLine($"#Number of touches: {GetSystemMetrics(SystemMetric.MAXIMUMTOUCHES)}.");
    Console.WriteLine($"#TabletMode: {GetSystemMetrics(SystemMetric.TABLETPC)}.");

    base.WndProc(ref m);
}

连接触摸设备会生成多个(4-5)DEVICECHANGE消息以及number of touches的混合结果,范围从全0,全部1或最好的情况下与最后一个混合a 10. Tabletmode要么是关闭的,要么是最好的情况。通常在number of touches之前的时间大于0.它似乎都是半随机且不可靠的。

示例输出:

#36.810 WndProc: 537 ==> DEVICECHANGE
#Number of touches: 0.
#TabletMode: 0.
#36.827 WndProc: 537 ==> DEVICECHANGE
#Number of touches: 0.
#TabletMode: 0.
#36.866 WndProc: 537 ==> DEVICECHANGE
#Number of touches: 0.
#TabletMode: 0.
#36.876 WndProc: 537 ==> DEVICECHANGE
#Number of touches: 0.
#TabletMode: 0.
#36.976 WndProc: 712 ==> 712
#Number of touches: 0.
#TabletMode: 0.

幸运的是,每次插拔触摸设备时,我都会收到消息0x02c8 (712)0x02c9 (713)。这感觉就像某种touch device connectedtouch device disconnected消息,但windows message枚举没有这些消息。环顾四周,我实际上找不到包含它们的windows message列表。我甚至查看了WinUser.h个文件。

所以根据标题,有谁知道这些Windows消息是什么?

1 个答案:

答案 0 :(得分:2)

我的怀疑是正确的,来自tpcshrd.h:

#define WM_TABLET_DEFBASE                    0x02C0
#define WM_TABLET_MAXOFFSET                  0x20
#define WM_TABLET_ADDED                      (WM_TABLET_DEFBASE + 8)
#define WM_TABLET_DELETED                    (WM_TABLET_DEFBASE + 9)
#define WM_TABLET_FLICK                      (WM_TABLET_DEFBASE + 11)
#define WM_TABLET_QUERYSYSTEMGESTURESTATUS   (WM_TABLET_DEFBASE + 12)