Vb.net 自动注销Windows窗体

Vb.net 自动注销Windows窗体,vb.net,winforms,events,logout,Vb.net,Winforms,Events,Logout,我有一个Windows窗体应用程序是在VB.NET2010中开发的,现在我需要实现自动注销。 我正在考虑使用一个计时器,它可以在每个事件中重置它,或者保存用户执行的每个操作的时间戳,问题是如何检测每个事件 应用程序有几个在运行时创建的控件和一些子窗口窗体 或者可能有人对如何实现这一目标有更好的想法。(在一段不活动时间后将用户从应用程序中注销。) 编辑: Anthony编写的代码从C#转换为VB 我在WinForm类和一个单独的类中尝试了这段代码,得到了相同的结果。 “类'MessageFilt

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

应用程序有几个在运行时创建的控件和一些子窗口窗体

或者可能有人对如何实现这一目标有更好的想法。(在一段不活动时间后将用户从应用程序中注销。)


编辑: Anthony编写的代码从C#转换为VB

我在WinForm类和一个单独的类中尝试了这段代码,得到了相同的结果。 “类'MessageFilter'必须将'System.Windows.Forms.IMessageFilter'接口的'Function PreFilterMessage(ByRef m As Message)实现为布尔'。”

已解决: 转换中的错误出现在函数签名中,该签名必须如下所示

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
然后,当我需要添加Msg过滤器时

Application.AddMessageFilter(MyMsgFilter)
什么时候需要移除它

Application.RemoveMessageFilter(MyMsgFilter)
非常感谢安东尼

如何检测每个事件


你并不需要每个事件。一些策略性事件,比如
MouseMove
和一些精心挑选的
KeyDown
处理程序应该涵盖它。在这些事件中,我要做的只是更新一个全局时间戳变量,其他什么都不需要。然后我还会有一个计时器,每隔一段时间触发一次,并检查时间戳的间隔。

Y您可以通过创建一个消息过滤器并响应某些类型的频繁消息来实现这一点。示例代码是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;
    }
}
在应用程序中的某个位置,用户登录后,可以使用该方法注册消息筛选器


该示例仅侦听和事件,这两个事件的发生频率都应该足够高,但不会太频繁,以至于消息过滤器会减慢整个应用程序的速度。WinForms应用程序中会触发大量消息,对发送的每一条消息都执行某些操作不是一个好主意。

但是只有当鼠标移动到表单上,并且我的应用程序有很多控件使用了很多表单表面,比如数据网格和/或TabControls,那么如果用户将鼠标放在某个控件上,即使用户仍然在使用该程序,该方法也会注销用户ol将该代码添加到每一条消息中。@E_Blue查看
应用程序。AddMessageFilter
允许您基本上钩住所有消息。我仍然建议只更新一个时间(或重新启动计时器)在某些类型的事件上,因为消息筛选器将被频繁调用,并且执行任何可能密集的操作都会降低应用程序的速度。谢谢。这将捕获所有消息,甚至来自运行时创建的控件的消息?来自控件(如计时器)的消息如何?我有几个计时器要更新e数据网格。有一些属性可以将这些消息与用户活动区分开来?为了更好地演示,我发布了一个答案,但消息过滤器将能够侦听系统中的所有消息。从技术上讲,并不是所有事件都是从消息生成的,但其中许多事件都是从消息生成的。我将代码添加到原始问题,IDE备注IMessage过滤在第二行。我转换了代码,得到了一个错误“类'MessageFilter'必须实现'System.Windows.Forms.IMessageFilter'接口的'Function PreFilterMessage(ByRef m As Message)As Boolean'”。另一个疑问是从哪里获得消息代码(六位数字)?我想通过单击更改Mouseleve。该错误使您看起来没有正确地将其转换为VB.NET。如果没有看到您的代码,则很难判断。通过联机搜索可以轻松找到windows消息代码。您可以搜索特定消息,例如。没有
单击
消息,因为它实际上是just对MouseDown的响应,然后是MouseUp。当用户注销时,我必须处理MessageFilter,因为如果不是,我每次登录都会得到一个新的MessageFilter,那么我必须怎么做?我知道我必须使用Application.RemoveMessageFilter(),但括号之间必须写什么?如何引用MessageFilter?
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(new MessageFilter());