2

私は2つのことを知りたいデスクトップアプリケーションを持っています:

  1. ユーザーは現在PCを使用していますか(具体的には、PCに入力を行っていますか)、必要に応じて状態を「離れている」に変更できます。と
  2. スクリーンセーバーは現在実行されているので、その間にCPUを集中的に使用する作業を実行できます。

私はC#/。NETを使用しています。これらの2つのタスクにどのように取り組むことを提案しますか?

:WIN32の呼び出しは、アンマネージコードソリューションと同様に優れています。

4

4 に答える 4

5

http://dataerror.blogspot.com/2005/02/detect-windows-idle-time.html

^Windowsのアイドル時間を検出します。:)

この機能のイネーブラーは、GetLastInputInfo()Win32APIとLASTINPUTINFOWin32構造体です。

于 2010-12-23T06:17:58.867 に答える
5

スクリーンセーバーが実行されているかどうかを検出するコードは次のとおりです。詳細についてはこちらをご覧ください

const int SPI_GETSCREENSAVERRUNNING = 114;

[DllImport( "user32.dll", CharSet = CharSet.Auto )]
private static extern bool SystemParametersInfo( 
   int uAction, int uParam, ref bool lpvParam, 
   int flags );


// Returns TRUE if the screen saver is actually running
public static bool GetScreenSaverRunning( )
{
   bool isRunning = false;

   SystemParametersInfo( SPI_GETSCREENSAVERRUNNING, 0, 
      ref isRunning, 0 );
   return isRunning;
}
于 2010-12-23T06:23:03.173 に答える
0

グローバルキーボード/マウスフックを使用して、どちらかからイベントを受信したときに「カウンター」を0にリセットすることができます。カウンターが探しているアイドル時間に達したら、バックグラウンドアクションを実行します。

.NETでフックを簡単に実行できるコードがここにあります:http://www.codeproject.com/KB/cs/globalhook.aspx

于 2010-12-23T06:21:57.867 に答える
0

より集中的な作業をいつ実行するかを考えるのではなく...できるだけ早く「集中的な作業」を実行することを検討してください。ただし、スレッドの優先度は低くしてください。

マウスの位置をポーリングして動きを観察しない限り、あなたの質問に純粋なC#で答えがあるとは思いません...またはそのようなもの。

于 2010-12-23T05:59:36.043 に答える