Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何进入登录表单-如果我的C#程序中没有任何按键?_C#_Winforms - Fatal编程技术网

如何进入登录表单-如果我的C#程序中没有任何按键?

如何进入登录表单-如果我的C#程序中没有任何按键?,c#,winforms,C#,Winforms,我的C#WinForm程序中有登录表单和主表单 当我在主窗体中,用户在5分钟内没有按任何键或移动鼠标时,我想进入登录窗体 如何在C#WinForm中实现这一点 提前感谢在表单上放置一个计时器,让它做正确的事情,不管是什么(关闭当前表单、清除字段等)创建一个空基类(继承自表单类,覆盖该类中的onkeypress和onmousemove事件)对于所有应用程序窗体,在基本窗体的构造函数中创建一个计时器实例,并在其中将计时器间隔设置为5分钟,如果可能,执行任何必要的清理!确保rest的所有表单都是用ti

我的C#WinForm程序中有登录表单和主表单

当我在主窗体中,用户在5分钟内没有按任何键或移动鼠标时,我想进入登录窗体

如何在C#WinForm中实现这一点


提前感谢

在表单上放置一个计时器,让它做正确的事情,不管是什么(关闭当前表单、清除字段等)

创建一个空基类(继承自表单类,覆盖该类中的onkeypress和onmousemove事件)对于所有应用程序窗体,在基本窗体的构造函数中创建一个计时器实例,并在其中将计时器间隔设置为5分钟,如果可能,执行任何必要的清理!确保rest的所有表单都是用timer从这个基类继承的,这样就完成了。否则,您将编写/修改应用程序中的所有表单,以添加计时器和设置间隔

注意:当您的应用程序中有很多表单时,这将非常有用!如果你有两个,那就没问题了,如果你去每一个,添加一个计时器,设置一个时间间隔,并编写一些常用代码来清理,你可以使用一个,然后设置它,比如说,5秒钟。然后,您有一个属性,该属性说明用户最后一次按键或移动鼠标是什么时候(您可以在适当的事件处理程序中设置此属性:和)。如果计时器滴答作响且自上次用户操作以来的时间超过5分钟,则可以注销当前用户


但这对我来说并不是一个非常有用的功能,我认为这只是一个麻烦。

最好的方法是为输入消息创建Windows钩子。每次收到鼠标或键盘消息时,请重新启动计时器。计时器过期时,注销用户


应该有帮助。

我制作了一个小示例,向您展示如何在完整的应用程序级别上实现用户活动检测。诀窍在于使用应用程序消息过滤器

此示例将在用户5分钟内未处于活动状态时引发消息

using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;

namespace WindowsFormsApplication2
{
    static class Program
    {

        private static Timer _idleTimer;

        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);

            _idleTimer = new Timer();
            _idleTimer.Tick += new EventHandler(_idleTimer_Tick);
            _idleTimer.Interval = (5 * 60) * 1000; // (5 minutes * seconds) * milliseconds

            Application.AddMessageFilter(new MouseMessageFilter(UserIsActive));
            Application.AddMessageFilter(new KeyboardMessageFilter(UserIsActive));

            Application.Run(new Form1());
        }

        static void _idleTimer_Tick(object sender, EventArgs e)
        {
            MessageBox.Show("You are idle for " + _idleTimer.Interval.ToString() + " milliseconds");
        }

        static void UserIsActive(object sender, EventArgs e)
        {
            _idleTimer.Stop();
            _idleTimer.Start();
        }

        public class MouseMessageFilter : IMessageFilter
        {
            private EventHandler _callback;

            public MouseMessageFilter(EventHandler callback)
            {
                _callback = callback;
            }

            private const int WM_MOUSEMOVE = 0x0200;

            public bool PreFilterMessage(ref Message m)
            {
                if (m.Msg == WM_MOUSEMOVE)
                {
                    _callback(null, null);
                }

                return false;
            }
        }

        private class KeyboardMessageFilter : IMessageFilter
        {
            private EventHandler _callback;

            public KeyboardMessageFilter(EventHandler callback)
            {
                _callback = callback;
            }

            const int WM_KEYDOWN = 0x100;
            const int WM_KEYUP = 0x0101;
            const int WM_SYSKEYDOWN = 0x104;
            const int WM_SYSKEYUP = 0x0105;

            #region IMessageFilter Members

            public bool PreFilterMessage(ref Message m)
            {
                if ((m.Msg == WM_KEYDOWN) || (m.Msg == WM_SYSKEYDOWN))
                {
                    _callback(null, null);
                }

                if ((m.Msg == WM_KEYUP) || (m.Msg == WM_SYSKEYUP))
                {
                    _callback(null, null);
                }

                return false;
            }

            #endregion
        }

    }
}

但如何测量最后一次按键或鼠标移动后的5分钟?只需使用一个IMessageFilter,它可以处理鼠标和键盘消息。感谢您的帮助,但即使我按下任何键或移动鼠标,它也可以工作mouse@Gali:不客气。@Hans Passant想说的是,鼠标和键盘只能在一个MessageFilter中处理。这就是Windows屏幕保护程序所做的。不要试图替换它,你的程序没有受到一百万黑客试图破坏它的攻击。