自己写的一个系统,要求用户在一段时间内不对系统进行操作后就锁定系统,就象Windows的屏保一样,回来后移动鼠标或按下键盘再提示输入密码重新进入系统??

解决方案 »

  1.   

    不好,其它用户可以做一个程序把你那个无边框的窗体关掉的(向那个窗口发WM_CLOSE的消息)我觉得不如启动Windows的锁定功能LockWorkStation
      

  2.   

    Aallonlin(风之力) :这样不行呀,如果用户正在操作,不能弹出的呀!
    偶现在最主要的问题是怎么知道用户有十分钟或是二十分钟没有操作应用程序了; 应用程序有一个主界面,其它的功能模块都是由这个主界面通过反射来回载UserControl的,可以从这方面做点儿文章吗?
      

  3.   

    tiaoci(我挑刺,我快乐) 
    就算启动windows的锁定功能,但目前也不知道用户多久没有操作应用程序了呀?
      

  4.   

    在Application.OnIdle事件中启动计时器
    再用Application.AddMessageFilter()监视消息,有消息就停止计时器
    这样就能做到一段时间没有任何消息就产生计时器的Tick事件
      

  5.   

    SetWindowsHookEx 获得键盘/鼠标事件从而计算用户什么时候不活动了
      

  6.   

    就算启动windows的锁定功能,但目前也不知道用户多久没有操作应用程序了呀?这个可以用一个API 函数GetLastInput来获得用户最后一次输入的时间,或者你可以用Hook设置最后输入时间,然后根据当前时间计算出用户空闲了多长时间。
      

  7.   

    lucbesson(女娃哈哈) 当程序失去焦点后计算时间也不够真实啊,如果用户一直没有操作,就停在那里的话,也是对系统没有操作,但程序并没有失去焦点呀!fancyf(Fancyray)我查了一下Application.AddMessageFilter(),是将一个消息添加到过滤器里,以便这些消息在发送到窗体时监视它,我想你的意思是在这些添加鼠标和键盘的消息事件,监视它们,当没有这些事件的时候开始计时,到了指定的时间就锁定程序,但我试了一下还是不太明白怎么做,那个接口类该怎么写? tiaoci(我挑刺,我快乐)用SetWindowsHookEx??能不能再具体点儿??singleflower(shifan(愿父亲安息)) 我没有用过钩子函数,还有GetLastInput()?能再具体点儿吗?谢谢大家的帮忙!!
      

  8.   

    在Main中写:
    Form1 form = new Form1();
    Application.Idle += new EventHandler(form.OnIdle);
    Application.AddMessageFilter(form);
    Application.Run(form);OnIdle:没有其他消息的时候就开始计时
    private void OnIdle(object o,System.EventArgs e)
    {
    timer.Start();
    }在PreFilterMessage中只写timer.Stop();就可以做到有消息就停止然后timer.Tick += new System.EventHandler(this.timer_Tick);把要执行的内容写在timer_Tick()函数中就可以了
      

  9.   

    定义个程序级的变量A,放个timer程序运行时A+1,等到A=一个值时,出现你的“屏幕保护”然后写个过程:遍历一个窗体的所有控件,然后让所有控件在发生mousemove事件时将A赋为0,
    每个窗体启用时都调用该过程。你看这方法中不?(注:方法笨了点,不过应该挺管用,至于如何锁定,自己解决吧)呵呵!!
      

  10.   

    谢谢 fancyf(Fancyray) ,基本上可以解决了:
    1、将MainForm及所用到的UserControl都实现IMessageFilter接口
    2、在Application.AddFilterMessage()方法中把MainForm和UserControl都加进来!
    3、在Application.OnIdle事件里进行计数;
    4、在PreFilterMessage()接口方法里当计数器停止现在还有一些担心就是有一些最基本的消息会在PreFilterMessage()里捕获到,如
    m.Msg = 275 , m.Msg = 512 , m.Msg = 15(这个好象是Timer控件的消息)
    目前还在测试,看有没有基本的情况会导致不正确的锁定!Thanks everyone!