私は今日この問題を抱えています、私はこの解決策を見ました:
私のアプリケーションがC#でアイドル状態であることを検出する方法は?
私はそれを試しましたが、私のフォームは userControls やその他の要素で覆われており、マウスオーバーまたはキーダウン イベントはそれらの要素の余白でのみ発生します。
より良い方法はありますか?
私は今日この問題を抱えています、私はこの解決策を見ました:
私のアプリケーションがC#でアイドル状態であることを検出する方法は?
私はそれを試しましたが、私のフォームは userControls やその他の要素で覆われており、マウスオーバーまたはキーダウン イベントはそれらの要素の余白でのみ発生します。
より良い方法はありますか?
タイマーとマウス イベントを使用してソリューションをハッキングする必要はありません。Application.Idle イベントを処理するだけです。
Application.Idle += Application_Idle;
private void Application_Idle(object sender, EventArgs e)
{
// The application is now idle.
}
Form
より動的なアプローチが必要な場合は、最終的にユーザーがアイドル状態の場合、イベントが発生しないため、すべてのイベントをサブスクライブできます。
private void HookEvents()
{
foreach (EventInfo e in GetType().GetEvents())
{
MethodInfo method = GetType().GetMethod("HandleEvent", BindingFlags.NonPublic | BindingFlags.Instance);
Delegate provider = Delegate.CreateDelegate(e.EventHandlerType, this, method);
e.AddEventHandler(this, provider);
}
}
private void HandleEvent(object sender, EventArgs eventArgs)
{
lastInteraction = DateTime.Now;
}
グローバル変数private DateTime lastInteraction = DateTime.Now;
を宣言し、イベント ハンドラーから割り当てることができます。次に、単純なプロパティを記述して、最後のユーザー インタラクションから経過した秒数を判断できます。
private TimeSpan LastInteraction
{
get { return DateTime.Now - lastInteraction; }
}
そしてTimer
、元のソリューションで説明されているように、プロパティをポーリングします。
private void timer1_Tick(object sender, EventArgs e)
{
if (LastInteraction.TotalSeconds > 90)
{
MessageBox.Show("Idle!", "Come Back! I need You!");
}
}