A função que desejo alcançar é chamar o programa quando não houver entrada de teclado, movimento do mouse ou ação de clique. A primeira coisa que vem à mente é usar o gancho HOOK para obter ações do teclado ou do mouse e chamar o programa se não houver nenhuma ação. O resultado das minhas tentativas é que sempre há um problema ao enganchar e enganchar.
Mais tarde, pensei que o protetor de tela do Windows entra no protetor de tela quando o teclado e o mouse não se movem, então mudei de ideia e quis fazer o programa dessa forma. Quando o teclado e o mouse não se movem, o sistema. entra na proteção de tela e, em seguida, detecta se o sistema está executando a proteção de tela, o programa é chamado se estiver em execução. Este método usa o protetor de tela como intermediário e deixa o trabalho de detecção dos movimentos do teclado e do mouse para o protetor de tela. SystemParametersInfo pode implementar funções para obter informações de proteção de tela. O código de referência é o seguinte:
'Chamadas de API e definições comuns: 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 tão longo = &H10 'Constante para saber se o protetor de tela está ativadoPrivate Const SPI_GETSCREENSAVERRUNNING As Long = &H72 'Constante para saber se o protetor de tela está em execuçãoPrivate Sub Timer1_Timer() Dim bRunning As Boolean 'Variável para saber se o protetor de tela está em execução, é claro que você pode definir a variável global SystemParametersInfo SPI_GETSCREENSAVERRUNNING, 0, bRunning, Falso 'Chama a API, bRunning retorna o status de execução do protetor de tela Debug.Print Time; "Protetor de tela em execução ="; bRunning 'Demo: imprime informações sobre se o protetor de tela está em execução End Sub 'Além disso, para verificar se o protetor de tela está ativado , você também pode usar o seguinte método: SystemParametersInfo SPI_GETSCREENSAVEACTIVE, 0 , bActive, False 'bActive é o valor de retorno (tipo lógico)
Mas não sei por que ainda tenho problemas para depurar no WIN7, solicitando SystemParametersInfo SPI_GETSCREENSAVERRUNNING, 0, bRunning, False
O tipo bRunning está errado e só pode ser abandonado.
Por fim, a solução final é usar a função GetLastInputInfo para obter o tempo ocioso do sistema. O código de referência é o seguinte:
Opção ExplicitPrivate Declarar Função GetLastInputInfo Lib "user32" (plii As LASTINPUTINFO) As BooleanPrivate Declarar Função GetTickCount Lib "kernel32" () As LongPrivate Tipo LASTINPUTINFO cbSize As Long dwTime As LongEnd Tipo 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("Porque a máquina não funcionou por 15 minutos, se 3 minutos Se não houver resposta, o sistema será forçado a desligar", vbYesNo + vbExclamation + vbDefaultButton2, "prompt") End If End IfEnd SubO texto acima é todo o conteúdo deste artigo, espero que todos gostem.