InputMessageFilter.cs 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. using Permission;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. using System.Windows.Forms;
  8. namespace YangjieTester
  9. {
  10. public class InputMessageFilter : IMessageFilter
  11. {
  12. public bool PreFilterMessage(ref Message m)
  13. {
  14. const int LBUTTONDOWN = 0x0201;
  15. const int LBUTTONUP = 0x0202;
  16. const int KEYDOWN = 0x0100;
  17. if (m.Msg == LBUTTONDOWN || m.Msg == LBUTTONUP || m.Msg == KEYDOWN)
  18. {
  19. InactivityMonitor.RecordActivity();
  20. }
  21. return false; // 不拦截消息,继续传递
  22. }
  23. }
  24. public static class InactivityMonitor
  25. {
  26. private static DateTime _lastActivity = DateTime.Now;
  27. private static System.Threading.Timer _timer;
  28. private static readonly object _lock = new object();
  29. static InactivityMonitor()
  30. {
  31. _timer = new System.Threading.Timer(CheckInactivity, null, TimeSpan.Zero, TimeSpan.FromSeconds(1));
  32. }
  33. public static void RecordActivity()
  34. {
  35. lock (_lock)
  36. {
  37. _lastActivity = DateTime.Now;
  38. }
  39. }
  40. private static void CheckInactivity(object state)
  41. {
  42. TimeSpan idle;
  43. lock (_lock)
  44. {
  45. idle = DateTime.Now - _lastActivity;
  46. }
  47. if (idle >= TimeSpan.FromMinutes(10))
  48. {
  49. // 回到 UI 线程执行操作
  50. if (Application.OpenForms.Count > 0)
  51. {
  52. var mainForm = Application.OpenForms[0];
  53. if (!mainForm.IsDisposed)
  54. {
  55. mainForm.BeginInvoke(new Action(() =>
  56. {
  57. PerformAutoAction();
  58. }));
  59. }
  60. }
  61. }
  62. }
  63. private static void PerformAutoAction()
  64. {
  65. // 比如退出、锁屏等
  66. // Application.Exit();
  67. PermissionManager.LogOffAndSignInOperator();
  68. }
  69. }
  70. }