我有一个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 connected
和touch device disconnected
消息,但windows message
枚举没有这些消息。环顾四周,我实际上找不到包含它们的windows message
列表。我甚至查看了WinUser.h
个文件。
所以根据标题,有谁知道这些Windows消息是什么?
答案 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)