我有一个 wacom 竹垫,想用它做一些疯狂的事情,包括抓住触摸板。触摸板有两种抓取方式:观察者和消费者。虽然观察者模式也将触摸数据传递给操作系统,但消费者单独“吃”数据。但是:消费者模式需要目标窗口是活动窗口。
问题来了。我需要另一个应用程序来同时接收键盘消息并防止鼠标受到触摸板的影响。
我已经尝试过一些选项:
- 带有“鼠标监狱”的观察者模式。嗯。我可能需要鼠标,所以不需要。
- 在平板电脑首选项中禁用触摸,但这确实会禁用触摸(正如它所暗示的那样),而不仅仅是通过垫子移动鼠标。
- 消费者模式并尝试将键盘 wndproc 消息传递给下一个应用程序。结果……没有。
我试图在窗口上抓取 wndproc,但由于我有具有键盘焦点的子控件,所以这不起作用。我最终使用了一个自定义文本框,它还覆盖了 wndproc 并获取 WP_KEYFIRST 和 WP_KEYLAST 之间的所有消息,并将它们交给我认为是下一个窗口(使用 GetForegroundWindow 和 GetWindow(GW_NEXTWINDOW))。我已经尝试过 SendMessage 和 PostMessage,但每次使用记事本进行快速测试都失败了。
所以我的问题是:我怎样才能传递 wndproc 键盘消息或禁用触摸板完成的鼠标移动?
PS:在某些时候我得到了想要的结果(观察者但没有鼠标操作),但这是一个巧合,重新插入平板电脑就可以解决它。我无法重现它。
编辑:
在进一步摆弄 winapi 和键盘密码之后,这种方法似乎是不可能的(或者非常非常困难......)有一种方法可以在此处获取所有窗口 [ 1 ],您还可以从此片段中获取 z 顺序。但是:并非每个窗口都处理此窗口的键盘输入。听起来很愚蠢,很愚蠢(在我看来)。Windows 似乎不会通过窗口将键盘事件向下传递给目标控件,而是直接传递给控件。但仅在某些情况下。所以我放弃了这种特定的方法。另一种方法是让它明确地为我需要的程序工作(这在我的情况下是可能的)或者采用上面提到的其他方式。由于不想使用这样的黑客,我对如何禁用鼠标移动的想法持开放态度。
[1]:像 alt-tab 一样枚举窗口