PDA

View Full Version : حرفه ای: تعيين زمان استفاده نشدن موس و كيبرد



kiarashk
شنبه 01 بهمن 1390, 22:10 عصر
دوستان كسي ايده اي داره كه بشه باهاش فهميد كاربر چه مدت هست كه به موس و كيبردش دست نزده اگه بخوام دقيق تر بگم مثل اسكرين سيور اين تايم رو چطور مي شه به دست اور.

اگه حتي يه ايده كوچيك هم داريد مي تونه كمك كنه؟!

shadi khanum
شنبه 01 بهمن 1390, 22:27 عصر
نمیدونم راه درستش چیه ولی میشه یه کلاس تعریف کنی و توش یه with event Timer و یه متغیر از نوع int64 به صورت shared تعریف کنی، بعد تو همون کلاس متد tick اون timer رو raise کنی و تو اون متد اون متغیر Shared رو یکی اضافه کنی. حالا تو فرم های برنامت واسه همشون متد keydown رو raise کنی و تو اون متد اون متغیر shared رو 0 کنی.. اینجوری هر وقت به keyboard دست بزنه کاربر اون متغیر reset میشه و تا keydown بعدی تو تیک تایمر یکی یکی اضافه میشه.. یعنی هروقت خواستی ببینی کاربر چقده که دست به کیبرد نزده، مقدار اون متغیر shared میشه جوابت..
موفق باشی

kiarashk
یک شنبه 02 بهمن 1390, 00:12 صبح
نمیدونم راه درستش چیه ولی میشه یه کلاس تعریف کنی و توش یه with event Timer و یه متغیر از نوع int64 به صورت shared تعریف کنی، بعد تو همون کلاس متد tick اون timer رو raise کنی و تو اون متد اون متغیر Shared رو یکی اضافه کنی. حالا تو فرم های برنامت واسه همشون متد keydown رو raise کنی و تو اون متد اون متغیر shared رو 0 کنی.. اینجوری هر وقت به keyboard دست بزنه کاربر اون متغیر reset میشه و تا keydown بعدی تو تیک تایمر یکی یکی اضافه میشه.. یعنی هروقت خواستی ببینی کاربر چقده که دست به کیبرد نزده، مقدار اون متغیر shared میشه جوابت..
موفق باشی
مساله اينجاست كه بايد اگه كاربر داشت توي يه برنامه ديگه مثلا ورد از كيبرد استفاده كنه متغيير reset بشه اما نمي دونم چه طوري مي شه اين key down رو به كل سيستم ربط داد نه فقط به يرنامه من اگه بخوام بيشتر توضيح بدم مي تونيد اينطوري فرض كنيد كه برنامه من minimaize باشه و اگه كاربر مدت ٥ دقيقه به موس و كيبرد دست نزد اون وقت برنامه من مثل اسكرين سيور ماكزيمايز بشه و تازه كاربر ببينتش
به هر حال از پاسختون ممنون

klinton
یک شنبه 02 بهمن 1390, 01:04 صبح
http://barnamenevis.org/showthread.php?86919-ط²ظ…ط§ظ†-ط¨غŒع©ط§ط±-ط¨ظˆط¯ظ†-ع©ط§ط±ط¨ط±

shadi khanum
یک شنبه 02 بهمن 1390, 12:10 عصر
این لینکی که گذاشتین که جواب ایشون نبود. کدها درست کار نمیکرد.. فک کنم شما باید با APIها کار کنی اگه میخوای تو برنامه های دیگه رو هم چک کنی

kiarashk
یک شنبه 02 بهمن 1390, 14:43 عصر
این لینکی که گذاشتین که جواب ایشون نبود. کدها درست کار نمیکرد.. فک کنم شما باید با APIها کار کنی اگه میخوای تو برنامه های دیگه رو هم چک کنی

خودم هم فكر مي كنم بايد از API استفاده كنم اما تابع لازم رو بلد نيستم و لينك دوستمون هم كمكي نكرد ؟ كسي پيشنهادي نداره به هر حال برنامه هايي هستن كه اين كار رو انجام مي دن پس بايد يه راهي باشه؟؟!

mafmaf
دوشنبه 03 بهمن 1390, 19:40 عصر
سلام دوست عزیز من این کد رو زمانی برای خاموش شدن صفحه مانیتورم نوشته بودم.با کمی تغییر به نتیجه دلخواهت میرسی.البته خیلی سادست.اگر سوالی بود در خدمتم.


Public Class Form1
Dim ax As Integer
Dim cx As Integer
Dim bx As Integer
Dim sx As Integer
Dim txt As Integer = 0
Dim result As Integer
Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Integer) As Integer
Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hwnd As Int32, ByVal wMsg As Int32, ByVal wParam As Int32, ByVal lParam As Int32) As Int32
Const MONITOR_ON As Int32 = -1
Const MONITOR_OFF As Int32 = 2
Const SC_MONITORPOWER As Long = &HF170&
Const WM_SYSCOMMAND As Long = &H112

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Microsoft.Win32.Registry.LocalMachine.OpenSubKey("Software\Microsoft\Windows\CurrentVersion\Run ", True).SetValue("sleep.exe", Application.ExecutablePath, Microsoft.Win32.RegistryValueKind.String)


Timer1.Enabled = True
Timer1.Interval = 1
Timer2.Enabled = True
Timer2.Interval = 10000
Timer8.enabled = True
Timer8.Interval = 50
Timer4.Enabled = True
Timer4.Interval = 600000
Timer5.Enabled = True
Timer5.Interval = 9800
Timer6.Enabled = True
Timer6.Interval = 20000
Timer1.Start()
Timer2.Start()
Timer4.Start()
Timer5.Start()
Timer6.Start()
Timer8.start()
Me.Opacity = 0
Me.Hide()

End Sub

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
ax = Cursor.Position.X
Timer1.Interval = 20000
Timer1.Start()

End Sub

Private Sub Timer2_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer2.Tick
bx = Cursor.Position.X
Timer2.Interval = 20000
Timer2.Start()
End Sub



Private Sub Timer4_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer4.Tick
If txt = 55 Then

Timer3.Interval = 500000
Timer3.Start()
Dim gg As String
gg = "e:\Bubbles.scr".ToString
Process.Start(gg)
Timer4.Enabled = False


End If
End Sub


Private Sub Timer3_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer3.Tick
If txt = 55 Then
SendMessage(Me.Handle, WM_SYSCOMMAND, SC_MONITORPOWER, MONITOR_OFF)
Timer3.Stop()
End If
End Sub

Private Sub Timer5_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer5.Tick

If ax = bx Then

txt = txt + 1


Else
txt = 0
Timer4.Interval = 600000
Timer4.Start()
End If

If txt > 55 Then
txt = 55
End If
Label1.Text = txt
End Sub

Private Sub Timer6_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer6.Tick
If txt < 10 And Timer4.Enabled = False Then
Timer4.Enabled = True
Timer4.Interval = 600000
Timer4.Start()
End If
End Sub


Private Sub Timer8_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer8.Tick
For i = 1 To 255
result = 0
result = GetAsyncKeyState(i)
If result = -32767 Then
txt = 0
End If
Next
End Sub
End Class

shadi khanum
سه شنبه 04 بهمن 1390, 10:06 صبح
نمیدونم این لینک به دردت میخوره یا نه.. ولی یه نگاه بهش بندازی بد نیست
http://barnamenevis.org/showthread.php?23899-Hotkey-%D8%AF%D8%B1-vb.net

kiarashk
دوشنبه 10 بهمن 1390, 20:44 عصر
سلام دوست عزیز من این کد رو زمانی برای خاموش شدن صفحه مانیتورم نوشته بودم.با کمی تغییر به نتیجه دلخواهت میرسی.البته خیلی سادست.اگر سوالی بود در خدمتم.


Public Class Form1
Dim ax As Integer
Dim cx As Integer
Dim bx As Integer
Dim sx As Integer
Dim txt As Integer = 0
Dim result As Integer
Private Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Integer) As Integer
Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hwnd As Int32, ByVal wMsg As Int32, ByVal wParam As Int32, ByVal lParam As Int32) As Int32
Const MONITOR_ON As Int32 = -1
Const MONITOR_OFF As Int32 = 2
Const SC_MONITORPOWER As Long = &HF170&
Const WM_SYSCOMMAND As Long = &H112

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Microsoft.Win32.Registry.LocalMachine.OpenSubKey("Software\Microsoft\Windows\CurrentVersion\Run ", True).SetValue("sleep.exe", Application.ExecutablePath, Microsoft.Win32.RegistryValueKind.String)


Timer1.Enabled = True
Timer1.Interval = 1
Timer2.Enabled = True
Timer2.Interval = 10000
Timer8.enabled = True
Timer8.Interval = 50
Timer4.Enabled = True
Timer4.Interval = 600000
Timer5.Enabled = True
Timer5.Interval = 9800
Timer6.Enabled = True
Timer6.Interval = 20000
Timer1.Start()
Timer2.Start()
Timer4.Start()
Timer5.Start()
Timer6.Start()
Timer8.start()
Me.Opacity = 0
Me.Hide()

End Sub

Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
ax = Cursor.Position.X
Timer1.Interval = 20000
Timer1.Start()

End Sub

Private Sub Timer2_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer2.Tick
bx = Cursor.Position.X
Timer2.Interval = 20000
Timer2.Start()
End Sub



Private Sub Timer4_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer4.Tick
If txt = 55 Then

Timer3.Interval = 500000
Timer3.Start()
Dim gg As String
gg = "e:\Bubbles.scr".ToString
Process.Start(gg)
Timer4.Enabled = False


End If
End Sub


Private Sub Timer3_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer3.Tick
If txt = 55 Then
SendMessage(Me.Handle, WM_SYSCOMMAND, SC_MONITORPOWER, MONITOR_OFF)
Timer3.Stop()
End If
End Sub

Private Sub Timer5_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer5.Tick

If ax = bx Then

txt = txt + 1


Else
txt = 0
Timer4.Interval = 600000
Timer4.Start()
End If

If txt > 55 Then
txt = 55
End If
Label1.Text = txt
End Sub

Private Sub Timer6_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer6.Tick
If txt < 10 And Timer4.Enabled = False Then
Timer4.Enabled = True
Timer4.Interval = 600000
Timer4.Start()
End If
End Sub


Private Sub Timer8_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer8.Tick
For i = 1 To 255
result = 0
result = GetAsyncKeyState(i)
If result = -32767 Then
txt = 0
End If
Next
End Sub
End Class


ممنون البته هنوز امتحان نکردم ولی فکر کنم نتیجه بده تنها نگرانیم اینه که چون توی خود برنامه ار تایمر بازم استفاده شده این تعداد تایمر ها باعث کندی برنامه بشه به هرحال خیلی ممنون