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

What are windows message 0x02c8 and 0x02c9?

我有一个在连接到工业机器的 PC 上运行的 winforms 应用程序。有多台计算机通过显示通道切换设备和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 或者在最好的情况下与最后一个混合one 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 消息是什么吗?

我的猜测是正确的,来自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)