自动注销Windows窗体

时间:2015-04-09 17:31:11

标签: vb.net winforms events logout

我在VB.NET 2010中有一个Windows窗体应用程序,现在我需要实现自动注销。 我正在考虑使用一个定时器来重置每个事件或者保存用户执行的每个动作的时间戳,问题是如何检测每个事件。

应用程序在运行时创建了几个控件,并创建了一些子窗体。

或者也许有人对如何实现这一目标有更好的了解。(在一些不活动时间后从应用程序中注销用户。


修改 安东尼的代码从C#转换为VB

Class MessageFilter
    Implements IMessageFilter
    Public Function PreFilterMessage(ByRef m As Message) As Boolean
        Const WM_KEYDOWN As Integer = &H100
        Const WM_MOUSELEAVE As Integer = &H2A3

        Select Case m.Msg
            Case WM_KEYDOWN, WM_MOUSELEAVE
                ' Do something to indicate the user is still active.
                Exit Select
        End Select

        ' Returning true means that this message should stop here,
        ' we aren't actually filtering messages, so we need to return false.
        Return False
    End Function
End Class

我在WinForm类中尝试了这个代码,并在一个单独的类中尝试了相同的结果。 " Class' MessageFilter'必须实现'函数PreFilterMessage(ByRef m As Message)作为布尔值' for the interface' System.Windows.Forms.IMessageFilter'。"

解决: 转换中的错误在函数签名中必须如下所示。

Public Function PreFilterMessage(ByRef m As System.Windows.Forms.Message) As Boolean Implements System.Windows.Forms.IMessageFilter.PreFilterMessage

编辑2: 要删除过滤器,我按照这种方式声明过滤

Public Class Form1 
  Friend MyMsgFilter As New MessageFilter()
End Class

然后,当我需要添加消息过滤器

Application.AddMessageFilter(MyMsgFilter)

何时需要将其删除

Application.RemoveMessageFilter(MyMsgFilter)

非常感谢安东尼。

2 个答案:

答案 0 :(得分:1)

  

如何检测每个事件?

您并不需要每个事件。一些战略事件,例如MouseMove和一些精心挑选的KeyDown处理程序应该涵盖它。我在这些事件中所做的只是更新全局时间戳变量,仅此而已。然后,我还会有一个频繁启动的计时器,并检查自时间戳以来的时间。

答案 1 :(得分:1)

您可以通过创建邮件过滤器并响应某些类型的频繁邮件来完成此操作。示例代码是C#,但转换为VB.NET应该不难。

class MessageFilter : IMessageFilter
{
    public bool PreFilterMessage(ref Message m)
    {
        const int WM_KEYDOWN = 0x0100;
        const int WM_MOUSELEAVE = 0x02A3;

        switch (m.Msg)
        {
            case WM_KEYDOWN:
            case WM_MOUSELEAVE:
                // Do something to indicate the user is still active.
                break;
        }

        // Returning true means that this message should stop here,
        // we aren't actually filtering messages, so we need to return false.
        return false;
    }
}

在您的应用程序的某个位置,用户登录后,您可以使用Application.AddMessageFilter方法注册邮件过滤器。

Application.AddMessageFilter(new MessageFilter());

该示例仅监听KeyDownMouseLeave事件,这些事件应该足够频繁地发生,但不是频繁,以至于消息过滤器正在减慢整个应用程序的速度。在WinForms应用程序中触发了大量消息,并且为每个发送的消息执行某些操作不是一个好主意。