TEMPO DE INATIVIDADE

GUIGOR 28/03/2015 23:05:22
#445552
Boa noite,

Amigos preciso colocar no meu projeto VB6 saber quando o usuario nao mexe nem no mouse nem no teclado para que pudesse botar um timer para sair de um determinado form.

ex: o usuario esta mexendo e ele para de mexer ai eu tenho que saber por quanto tempo dele deixo de mexer no mouse ou no teclado e ai quando se passar 30 segundos sem mexer nem no mouse nem no teclado ai eu tenho que sair do form.

desde ja muito obrigado a todos
EPISCOPAL 29/03/2015 02:12:41
#445553
em relação ao teclado pode usar o evento keypress ... ao mouse vai ter que usar apis ...

NICKOSOFT 29/03/2015 05:22:34
#445554
Ja tentou adaptar aqueles projetos de screen saver? Em vez de carregar form, vc vai ocultar form
NILSONTRES 29/03/2015 14:31:19
#445558
Serve em vb.net ?
SIRIOUS 03/04/2015 10:06:27
#445659
Olá..
Nessa api, se o usuário movimentar o mouse, é interrompido o timer.Interval definido, e recomeça a contagem de tempo.
Entretanto, o tempo do timer.Interval é elastecido (P.ex., se estiver definido para 30.000 milissegundos, a recontagem
redefine o tempo programado para aprox. 60.000 milissegundos).
Existe alguma maneira para reconduzir a contagem para o que está programado no timer.Interval?
(pelos testes que fiz, se programar o intervalo para aprox. 1 min, qualquer toque no mouse ou no teclado leva a ação
a ser executada em aprox. 2 min.
).
SIRIOUS 03/04/2015 12:53:05
#445663
[ô]Há uma solução bem mais simples, conforme abaixo.
[ô](o evento que reconta o temporizador é o movimento do mouse).
[ô]A propriedade <Interval> foi definida para o valor 1020 (valor mais próximo de
[ô]1 segundo). E o tempo para descarregar o form é de 30 segundos.
[ô]A cada movimento do mouse, o tempo é recontado, voltando ao valor definido no
[ô]carregamento do form.

[txt-color=#007100]Option Explicit
Dim Tempo As Date

Private Sub Form_Load()
Tempo = [Ô]00:00:30[Ô]
End Sub

Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
Tempo = [Ô]00:00:30[Ô]
End Sub

Private Sub Timer1_Timer()
Tempo = TimeValue(Tempo) - TimeValue([Ô]00:00:01[Ô])
If Tempo = CDate([Ô]00:00:00[Ô]) Then
Unload Me
End If
End Sub[/txt-color]

EPISCOPAL 03/04/2015 14:21:23
#445664
Citação:

Sirius
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
Tempo = [Ô]00:00:30[Ô]
End Sub



Muito inteligente voce, parabens pela a criatividade. Porem se o form não estiver maximizado e o mouse passar fora do form, então a recontagem não começa.
Ao meu ver deve usar a apis e quando o mouse movimentar deve-se refazer a contagem:

Private Type POINTAPI
X As Long
Y As Long
End Type
Private mTeclado As Integer
Private mPos As POINTAPI
Private Declare Function GetCursorPos Lib [Ô]user32[Ô] (lpPoint As POINTAPI) As Long

Private sub Form_Load
Call GetCursorPos(mPos)
Tempo = [Ô]00:00:30[Ô]
End sub

Private Sub tmrEvento_Timer()

Dim xPos As POINTAPI
Call GetCursorPos(xPos)

If (xPos.X <> mPos.X Or xPos.Y <> mPos.Y) Then [ô]Se o mouse mexeu continua a 30[Ô]
Tempo = [Ô]00:00:30[Ô]
Exit Sub
End If

Tempo = TimeValue(Tempo) - TimeValue([Ô]00:00:01[Ô])
If Tempo = CDate([Ô]00:00:00[Ô]) Then [ô]Se zerou descarraga o form
Unload Me
End If

End Sub

Pronto ...... adaptei a minha ideia na sua ..... e o teclado tem alguma ideia???
GERMANO 03/04/2015 15:17:08
#445665
Resposta escolhida
A melhor maneira é com uma API: veja
Basta chamar o GetLastInput() que ira retornar o numero em segundos da ultima entrada de dados.

Private Declare Function GetLastInputInfo Lib [Ô]user32[Ô] (plii As Any) As Long
Private Declare Function GetTickCount Lib [Ô]kernel32[Ô] () As Long
Private Type LASTINPUTINFO
cbSize As Long
dwTime As Long
End Type

Function GetLastInput() As Long
Dim lii As LASTINPUTINFO
lii.cbSize = Len(lii)
Call GetLastInputInfo(lii)
GetLastInput = Int((GetTickCount() - lii.dwTime) / 1000)
End Function
EPISCOPAL 04/04/2015 00:37:15
#445678
Germano como utilizar esta API .... ? dá uma demonstração no exemplo para o rapaz ...
GERMANO 04/04/2015 09:31:47
#445683
Coloca em um timer com intervalo de 1000 milisegundos

Private Sub tmrEvento_Timer()
dim SegundosSemMexer as long
SegundosSemMexer = GetLastInput()
Debug.print = SegundosSemMexer
if SegundosSemMexer >30 then
[ô]Faça alguma coisa
end if
End Sub
EPISCOPAL 04/04/2015 10:08:19
#445685
Perfeito ..... GUIGOR é só copiar ... rsrs
Página 1 de 2 [11 registro(s)]
Tópico encerrado , respostas não são mais permitidas