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;
}
}