私は2つのことを知りたいデスクトップアプリケーションを持っています:
- ユーザーは現在PCを使用していますか(具体的には、PCに入力を行っていますか)、必要に応じて状態を「離れている」に変更できます。と
- スクリーンセーバーは現在実行されているので、その間にCPUを集中的に使用する作業を実行できます。
私はC#/。NETを使用しています。これらの2つのタスクにどのように取り組むことを提案しますか?
注:WIN32の呼び出しは、アンマネージコードソリューションと同様に優れています。
私は2つのことを知りたいデスクトップアプリケーションを持っています:
私はC#/。NETを使用しています。これらの2つのタスクにどのように取り組むことを提案しますか?
注:WIN32の呼び出しは、アンマネージコードソリューションと同様に優れています。
http://dataerror.blogspot.com/2005/02/detect-windows-idle-time.html
^Windowsのアイドル時間を検出します。:)
この機能のイネーブラーは、GetLastInputInfo()Win32APIとLASTINPUTINFOWin32構造体です。
スクリーンセーバーが実行されているかどうかを検出するコードは次のとおりです。詳細についてはこちらをご覧ください
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;
}
グローバルキーボード/マウスフックを使用して、どちらかからイベントを受信したときに「カウンター」を0にリセットすることができます。カウンターが探しているアイドル時間に達したら、バックグラウンドアクションを実行します。
.NETでフックを簡単に実行できるコードがここにあります:http://www.codeproject.com/KB/cs/globalhook.aspx
より集中的な作業をいつ実行するかを考えるのではなく...できるだけ早く「集中的な作業」を実行することを検討してください。ただし、スレッドの優先度は低くしてください。
マウスの位置をポーリングして動きを観察しない限り、あなたの質問に純粋なC#で答えがあるとは思いません...またはそのようなもの。