2

我的详细信息:运行 Windows CE 4.2、Compact Framework 2.0 SP1 的定制移动设备。到目前为止,C# 应用程序充分利用了 P/Invokes,没有任何问题。

我写了一个低级键盘钩子(类似于,但不完全相同,这个 CodeProject 帖子),它的工作非常好,但有一个例外。我们的软件所做的一件事是允许访问 Windows CE 的屏幕校准功能。这是您需要点击一系列目标的屏幕,最后按 Esc 取消或 Enter 接受。我们通过 P/Invoke调用这个功能,我认为这个 Win32 API 函数内部发生的按键被我的键盘钩子干扰了。

我的键盘钩子没有做任何密集的事情,也没有改变执行流程,但我认为两者的使用可能从根本上不兼容。当我在运行此屏幕后退出调试器时,当程序关闭时,所有的 Enter 键按下我都尝试一次全部“击中”(此设备会发出咔哒声)。这让我认为钩子没有正确地将按键传递给 Win32 API 函数,就像它正确传递给 .NET 应用程序一样。有什么想法吗?

您是否认为:
a)键盘钩子和需要键盘的 P/Invokes 不兼容,或者
b)我的键盘钩子实现是罪魁祸首,或者
c)它是否完全取决于硬件制造商、驱动程序等?

谢谢你的帮助!

4

1 回答 1

2

a) 不,它们完全兼容。键盘挂钩发生在 kenel 级别,因此任何使用键盘消息的内容都将通过它,无论它来自本机代码还是托管代码。

b)很难说,因为我们看不到您的实施

c)这是可能的(任何事情都是因为 CE 中的几乎所有东西都是 OEM 可更改的)但不太可能。大多数原始设备制造商对 GWES(这就是它所在的地方)并不多,因为它开箱即用。

现在,我假设您正在查看的特定部分来自对 TouchCalibrate 的调用,对吗?最好的办法是专门查看 TouchCalibrate 源代码 - 它带有 Platform Builder(包括 eval 版本)。

我的猜测是它正在“拦截”或至少阻止消息被发送。我在那里已经有一段时间了,那是在做触摸板驱动程序的时候,所以我没有过多关注键盘处理,但它在做什么将控制权传递给 GWES 子系统以查看原始触摸板点 -它没有运行 Windows 应用程序。因此,处理发送这些按键的应用程序消息泵很可能什么都不做(有点像当你抛出一个模态对话框时)。

我真的需要更好地解释到底发生了什么。您说“在运行此屏幕后退出调试器时”,但我不清楚这意味着什么。你的意思是你在代码中调用 TouchCalibrate,然后停止调试,然后发送消息,或者一旦 TouchCalibrate 本身屏幕关闭,它们就会被发送?

Remote Spy++ 或 Kernel Tracker 也可能对正在发生的事情提供一些见解。

于 2008-12-04T23:30:55.883 回答