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 connected
和 touch 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)
我有一个在连接到工业机器的 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 connected
和 touch 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)