2010-02-23 47 views
2

我们需要记录用户可能花费多少时间在一组表单中。主要的挑战是检测用户是否与应用程序进行交互。到目前为止,我发现这个链接(http://blog.opennetcf.com/ctacke/2009/05/19/DetectingApplicationIdle.aspx)提供了一个创意解决方案,但是我们公司在开源/第三方库上非常保守。 (我知道在表单级别安装消息过滤器是另一种选择,但它可能会使现有应用程序不必要的复杂。理想情况下,我想在应用程序级别安装消息过滤器。)如何在我的应用程序中检测用户不活动(windows mobile,c#)

在此先感谢您的任何想法或解决方案。

回答

0

Windows Mobile在用户与系统进行交互时设置一个命名事件。活动的名称存储在:HKLM\System\GWE\ActivityEvent。您可以设置一个线程来等待这个命名事件发出信号,并确定在事件触发时您的表单是否处于活动状态。您可以使用GetForegroundWindow来确定您的窗口在事件设置时是否有焦点。

另一种可能性是使用GetWindowLongSetWindowLong将您的表单子类化。这将导致您的表单收到的所有消息都被传递给一个新的WndProc函数。您可以检查WndProc函数中的活动消息(WM_LBUTTONDOWN,WM_LBUTTONUP,WM_COMMAND等),然后使用CallWndProc函数将消息传递回原始WndProc。

+0

问题是这些都非常可维护。如果你添加一个新的表单到你的应用程序,那么你必须对它进行子类化或者将它添加到你的搜索逻辑中,以知道它是否是你的表单获取事件。 – ctacke 2010-02-23 22:44:18

+0

命名事件听起来很不错。我从这个链接开始(Power to the Developers part 2,http://blogs.msdn.com/windowsmobile/archive/2005/08/11/450591.aspx)。子类本身并不复杂,但将其应用于选定的一组表单并仍然隐藏其他开发人员可能会使解决方案比需要更复杂。 – Codism 2010-02-24 14:08:12

2

真的没有一种简单的方法来使用CF的内置函数。您需要查看应用程序的所有消息,并且该博客条目中列出的IMessageFilter实现(通过SDF启用,因为CF不支持它们)是实现此目标的最简单方法。

通过创建自己的消息泵(通过P /调用GetMessage,TranslateMessage和DispatchMessage),然后不使用Application.Run,​​但您自己的调用,您始终可以执行与SDF相同的操作。无论如何,这就是SDF所做的一切。

相关问题