1

WPF アプリケーションに自動ログオフ機能が必要で、フックを使用して実装しました。ただし、マウスがアプリケーションの上にあるときはいつでも、パフォーマンスがフリーズし、低下し、耐えられないほど応答しなくなります。マウスがウィンドウから離れると、パフォーマンスは通常に戻ります。自動ログオフをオフにすると、パフォーマンスは常に問題ないため、間違いなくこれが原因です。これを回避するために別のやり方をする方法はありますか?

private void InitializeAutoLogoffFeature()
        {
            //var windowSpecificOSMessageListener = HwndSource.FromHwnd(new WindowInteropHelper(this).Handle);
            //if (windowSpecificOSMessageListener != null)
            //    windowSpecificOSMessageListener.AddHook(CallBackMethod);

            //AutoLogOffHelper.LogOffTime = _viewModel.logOffTime;
            //AutoLogOffHelper.MakeAutoLogOffEvent += AutoLogOffHelper_MakeAutoLogOffEvent;
            //AutoLogOffHelper.StartAutoLogoffOption();
            AutoLogOffHelper
        }

private static IntPtr CallBackMethod(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
        {
            try
            {
                //  Listening OS message to test whether it is a user activity
                if ((msg >= 0x0200 && msg <= 0x020A) || (msg <= 0x0106 && msg >= 0x00A0) || msg == 0x0021)
                {
                    AutoLogOffHelper.ResetLogoffTimer();
                }
                else
                {
                    // For debugging purpose
                    // If this auto logoff does not work for some user activity, you can detect the integer code of that activity  using the following line.
                    //Then All you need to do is adding this integer code to the above if condition.
                    Debug.WriteLine(msg.ToString());
                }
            }
            catch (Exception ex)
            {
                MessageHelper.LogError(ex);
            }

            return IntPtr.Zero;
        }



class AutoLogOffHelper
    {
        static System.Windows.Forms.Timer _timer;
        public static int LogOffTime { get; set; }

        public delegate void MakeAutoLogOff();
        static public event MakeAutoLogOff MakeAutoLogOffEvent;

        static public void StartAutoLogoffOption()
        {
            System.Windows.Interop.ComponentDispatcher.ThreadIdle += DispatcherQueueEmptyHandler;
        }

        static void _timer_Tick(object sender, EventArgs e)
        {
            if (_timer == null) return;

            System.Windows.Interop.ComponentDispatcher.ThreadIdle -= DispatcherQueueEmptyHandler;
            _timer.Stop();
            _timer = null;

            if (MakeAutoLogOffEvent != null)
            {
                MakeAutoLogOffEvent();
            }
        }

        static void DispatcherQueueEmptyHandler(object sender, EventArgs e)
        {
            if (_timer == null)
            {
                _timer = new System.Windows.Forms.Timer
                             {
                                 Interval = LogOffTime * 60 * 1000
                             };

                _timer.Tick += _timer_Tick;
                _timer.Enabled = true;
            }
            else if (_timer.Enabled == false)
            {
                _timer.Enabled = true;
            }
        }

        static public void ResetLogoffTimer()
        {
            if (_timer == null) return;
            _timer.Enabled = false;
            _timer.Enabled = true;
        }

    }
4

1 に答える 1

0

取り出してみてくださいdebug.writeline-非常に遅く、多くのイベントを処理する可能性があるため、簡単に問題になる可能性があります.

それができない場合は、プロファイラーを使用してリソースを消費しているものを確認してみましたか?

于 2012-11-12T16:01:56.820 に答える