无论如何要找出当前的Windows处于锁定模式?

时间:2010-05-18 05:12:17

标签: visual-studio-2005

我有一个用VS 2005编写的Windows应用程序。该应用程序每2分钟在一个计时器周期中对sql数据库进行查询。如果有任何数据更改,将使用新数据刷新窗口。

如果用户离开窗口,窗口将在一段时间后自动锁定。当窗户被锁定时,在2分钟内不断查询数据是没有意义的;因此我想在锁定时停止查询,以便减少网络数据流量,并保存当前的Windows资源,如内存和CPU。

我不确定是否有任何方法可以找出当前窗口被锁定?如果没有可用的.Net类,不确定是否有用于此目的的Windows API?

我的项目是.Net 2.0,所有用户都在Windows XP中。

1 个答案:

答案 0 :(得分:1)

您实际上并不想查询窗口是否已锁定,而是您要查询的是您的应用程序是否可见 - 如果您的应用程序可见,则无需刷新数据窗口被最小化或被另一个窗口覆盖,对吗?

解决此问题的标准方法是通过计时器并使窗口无效。使用the Timer class在未来2分钟安排计时器。当计时器触发时,通过Form.Invalidate()使您的窗口无效。

当您使窗口无效时,Windows将向其发送“paint”消息。在OnPaint处理程序中,您将使用数据更新屏幕。但这里是踢球者:如果您的窗口不可见,Windows将不会触发OnPaint事件(包括当前屏幕被锁定的情况)!

现在,您的数据库查询在OnPaint事件处理程序中执行可能有点过于昂贵,因此您可能必须在计时器处理程序中执行一些棘手的操作。例如,您可以在计时器处理程序中执行数据库查询,然后然后调用Form.Invalidate()。这意味着当您从锁定屏幕返回时,您的数据可能已过时,因此您可以检查DateTime.Now在计时器处理程序和OnPaint处理程序之间是否存在显着差异,如果是,立即安排另一个计时器。否则,请将计时器安排在距离OnPaint回拨的2分钟内再次运行。

我希望所有这些都有道理:)