私が実現したい機能は、キーボード入力、マウスの動き、またはクリックアクションがないときにプログラムを呼び出すことです。最初に思い浮かぶのは、フック HOOK を使用してキーボードまたはマウスのアクションを取得し、アクションがない場合にプログラムを呼び出すことです。試してみた結果、フッキングやフッキングの際には必ず問題が発生します。
その後、Windows のスクリーンセーバーはキーボードとマウスが動かないとスクリーンセーバーに入るのではないかと考え、キーボードとマウスが動かないときはそのような形でプログラムを作りたいと思いました。スクリーン セーバーに入り、システムがスクリーン セーバーを実行しているかどうかを検出し、実行中の場合はプログラムが呼び出されます。この方法では、スクリーン セーバーを仲介として使用し、キーボードとマウスの動きの検出作業をスクリーン セーバーに任せます。 SystemParametersInfo は、スクリーン セーバー情報を取得する関数を実装できます。参照コードは次のとおりです。
'API 呼び出しと共通定義: Private Declare Function SystemParametersInfo _ Lib "user32" _ Alias "SystemParametersInfoA" _ (ByVal uiAction As Long, _ ByVal uiParam As Long, _ pvParam As Any, _ ByVal fWInIni As Long) As Boolean Private Const SPI_GETSCREENSAVEACTIVE As Long = &H10 'スクリーンセーバーが有効かどうかの定数Private Const SPI_GETSCREENSAVERRUNNING As Long = &H72 'スクリーンセーバーが実行されているかどうかの定数Private Sub Timer1_Timer() Dim bRunning As Boolean 'スクリーンセーバーが実行されているかどうかの変数。もちろん、グローバル変数 SystemParametersInfo SPI_GETSCREENSAVERRUNNING を定義できます。 0、b実行中、偽'API を呼び出し、bRunning はスクリーン セーバーの実行ステータスを返します。 Debug.Print Time "Screen saver running="; bRunning 'Demo: スクリーン セーバーが実行されているかどうかに関する情報を出力します。 End Sub 'さらに、スクリーン セーバーが有効になっているかどうかを確認します。 、次のメソッドを使用することもできます: SystemParametersInfo SPI_GETSCREENSAVEACTIVE, 0 , bActive, False 'bActive は戻り値 (論理型)
しかし、WIN7 でのデバッグで依然として問題が発生し、SystemParametersInfo SPI_GETSCREENSAVERRUNNING、0、bRunning、False が表示される理由がわかりません。
bRunning の入力は間違っているので、諦めるしかありません。
最後に、最終的な解決策は、GetLastInputInfo 関数を使用してシステムのアイドル時間を取得することです。参照コードは次のとおりです。
Option ExplicitPrivate Declare Function GetLastInputInfo Lib "user32" (plii As LASTINPUTINFO) As BooleanPrivate Declare Function GetTickCount Lib "kernel32" () As LongPrivate Type LASTINPUTINFO cbSize As Long dwTime As LongEnd Type Private Sub Form_Load() Timer1.Interval = 1000 End Sub Private Sub Timer1_Timer() Dim lii As LASTINPUTINFO lii.cbSize = Len(lii) If GetLastInputInfo(lii) then If (GetTickCount - lii.dwTime) / 60000 >= 15 then Call MsgBox("マシンが 15 分間動作していないため、if 3 分応答がない場合、システムは強制的にシャットダウンされます。」、vbYesNo + vbExclamation + vbDefaultButton2, "プロンプト") End If End IfEnd Sub以上がこの記事の全内容です。皆さんに気に入っていただければ幸いです。