Что нового

[Мышь, клавиатура] Счетчик времени, нажатий клавиш, щелчков и перемещений мыши

snoitaleR

AutoIT Гуру
Сообщения
854
Репутация
223
Подскажите, пожалуйста, как реализовать на AutoIt счетчик времени, нажатий клавиш, щелчков и перемещений мыши?
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 705
Т.е время, в течении которого мышь и клавиатура бездействуют?
 
Автор
snoitaleR

snoitaleR

AutoIT Гуру
Сообщения
854
Репутация
223
Yashied
Принцип такой...
Нажимается "Старт", и программа начинает отсчет времени (в секундах), попутно подсчитывая количество нажатых клавиш на клавиатуре, щелчков кнопками мыши и количество перемещений мышью (например, в сантиметрах)...
Затем нажимается "Стоп", и программа выдает четыре числа...


Добавлено:
Сообщение автоматически объединено:

У меня есть исходник такой программы на DELPHI.7...
Сам составлял, но на AutoIt не знаю, как переложить...
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 705
Так если сам..., то в чем проблема? Один Hook + второй Hook и Voil?!

Если серьезно, то оставь эту программу лучше на Delphi. Реализация этого в AutoIt не принесет стабильности системе. Хотя, если ты напишешь DLL-ки на Delphi и подсунешь их AutoIt'у...
 
Автор
snoitaleR

snoitaleR

AutoIT Гуру
Сообщения
854
Репутация
223
Yashied
Я хотел бы по возможности избавиться от DELPHI, так как лицензия на него отсутствует, а данную программу хотелось бы развивать дальше...
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 705
Да, эта лицензия... :muttley:

У CreatoR'а есть это. Попробуй для начала разобраться с этой библиотекой. Вот еще простой пример Hook'а для клавиатуры.

+ TimerInit() и TimerDiff()
 
Автор
snoitaleR

snoitaleR

AutoIT Гуру
Сообщения
854
Репутация
223
Yashied
Ага... Спасибо, поковыряю...
Может, и получится... :smile:
 

amel27

Продвинутый
Сообщения
146
Репутация
55
snoitaleR сказал(а):
Я хотел бы по возможности избавиться от DELPHI, так как лицензия на него отсутствует, а данную программу хотелось бы развивать дальше...
переходи на Visual Studio Express Edition =)
 
Автор
snoitaleR

snoitaleR

AutoIT Гуру
Сообщения
854
Репутация
223
amel27
Я никогда не пользовался Visual Studio...
Теперь появился повод изучить его... :smile:


Добавлено:
Сообщение автоматически объединено:

ТЕСТОВОЕ СООБЩЕНИЕ!
Извините, что тестирую прямо в теме...
 
Автор
snoitaleR

snoitaleR

AutoIT Гуру
Сообщения
854
Репутация
223
Удалось наконец-то реализовать счетчик с помощью AUTOIT...
Вроде работает...

Код:
; НАЧАЛО

 OnAutoItExitRegister("QUIT")

 $SKEY=DllCallbackRegister("FKEY","int","int;ptr;ptr")
 $MKEY=DllCall("kernel32.dll","hwnd","GetModuleHandle","ptr",0)
 $HKEY=DllCall("user32.dll","hwnd","SetWindowsHookEx","int",13,"ptr",DllCallbackGetPtr($SKEY),"hwnd",$MKEY[0],"dword",0)

 $SMOUSE=DllCallbackRegister("FMOUSE","int","int;ptr;ptr")
 $MMOUSE=DllCall("kernel32.dll","hwnd","GetModuleHandle","ptr",0)
 $HMOUSE=DllCall("user32.dll","hwnd","SetWindowsHookEx","int",14,"ptr",DllCallbackGetPtr($SMOUSE),"hwnd",$MMOUSE[0],"dword",0)

 $FPOS=True
 $CURM=0
 $OLDX=0
 $OLDY=0

 $COUNTTIME=0
 $COUNTCLICK=0
 $COUNTKEY=0
 $COUNTMOVE=0
 $TIMER=TimerInit()

 While Sleep(10)
  $COUNTTIME=Floor(TimerDiff($TIMER)/1000)
  TrayTip("Фараон","T:"&$COUNTTIME&" C:"&$COUNTCLICK&" K:"&$COUNTKEY&" M:"&$COUNTMOVE,1)
 WEnd

 Func FKEY($nCode,$wParam,$lParam)
  If $nCode>=0 Then
   Select
    Case $wParam=0x0100 ; WM_KEYDOWN
     $COUNTKEY+=1
   EndSelect
  EndIf
  Return DllCall("user32.dll","long","CallNextHookEx","hwnd",$HKEY[0],"int",$nCode,"ptr",$wParam,"ptr",$lParam)
 EndFunc

 Func FMOUSE($nCode,$wParam,$lParam)
  If $nCode>=0 Then
   Select
    Case $wParam=0x0200 ; $WM_MOUSEMOVE
     $CUR=MouseGetPos()
     $CURX=$CUR[0]
     $CURY=$CUR[1]
     ;$CURX=BitAND($lParam,0xFFFF) ; LoWord
     ;$CURY=BitShift($lParam,16) ; HiWord
     If $FPOS Then
      $FPOS=False
     Else
      $CURM+=Floor(Sqrt(($OLDX-$CURX)*($OLDX-$CURX)+($OLDY-$CURY)*($OLDY-$CURY)))
     EndIf
     $OLDX=$CURX
     $OLDY=$CURY
     $COUNTMOVE=Floor($CURM/96*2.54)
    Case $wParam=0x0201 ; WM_LBUTTONDOWN
     $COUNTCLICK+=1
    Case $wParam=0x0204 ; WM_RBUTTONDOWN
     $COUNTCLICK+=1
    Case $wParam=0x0207 ; $WM_MBUTTONDOWN
     $COUNTCLICK+=1
   EndSelect
  EndIf
  Return DllCall("user32.dll","long","CallNextHookEx","hwnd",$HMOUSE[0],"int",$nCode,"ptr",$wParam,"ptr",$lParam)
 EndFunc

 Func QUIT()  
  DllCallbackFree($SKEY)  
  DllCall("user32.dll","int","UnhookWindowsHookEx","hwnd",$HKEY[0])  
  DllCallbackFree($SMOUSE)  
  DllCall("user32.dll","int","UnhookWindowsHookEx","hwnd",$HMOUSE[0])  
 EndFunc

; КОНЕЦ


Единственное, что не смог реализовать - это достать координаты мыши из переменной $lParam (две закомментированные строки)...
Буду рад, если кому-нибудь удастся это сделать... :smile:
 

AZJIO

Меценат
Меценат
Сообщения
2 752
Репутация
1 146
snoitaleR
Сделал вставку
Код:
Local $sRect = DllStructCreate("Int[2]", $lParam), _
$CURX = DllStructGetData($sRect, 1, 1), _
$CURY = DllStructGetData($sRect, 1, 2)


Код:
OnAutoItExitRegister("QUIT")
Global $dll = DllOpen("user32.dll")

$SKEY = DllCallbackRegister("FKEY", "int", "int;ptr;ptr")
$MKEY = DllCall("kernel32.dll", "hwnd", "GetModuleHandle", "ptr", 0)
$HKEY = DllCall($dll, "hwnd", "SetWindowsHookEx", "int", 13, "ptr", DllCallbackGetPtr($SKEY), "hwnd", $MKEY[0], "dword", 0)

$SMOUSE = DllCallbackRegister("FMOUSE", "int", "int;ptr;ptr")
$MMOUSE = DllCall("kernel32.dll", "hwnd", "GetModuleHandle", "ptr", 0)
$HMOUSE = DllCall($dll, "hwnd", "SetWindowsHookEx", "int", 14, "ptr", DllCallbackGetPtr($SMOUSE), "hwnd", $MMOUSE[0], "dword", 0)

$FPOS = True
$CURM = 0
$OLDX = 0
$OLDY = 0

$COUNTTIME = 0
$COUNTCLICK = 0
$COUNTKEY = 0
$COUNTMOVE = 0
$TIMER = TimerInit()

While Sleep(100)
	$COUNTTIME = Floor(TimerDiff($TIMER) / 1000)
	TrayTip("Фараон", "T:" & $COUNTTIME & " C:" & $COUNTCLICK & " K:" & $COUNTKEY & " M:" & $COUNTMOVE, 1)
WEnd

Func FKEY($nCode, $wParam, $lParam)
	If $nCode >= 0 And $wParam = 0x0100 Then
		$COUNTKEY += 1
	EndIf
	Return DllCall($dll, "long", "CallNextHookEx", "hwnd", $HKEY[0], "int", $nCode, "ptr", $wParam, "ptr", $lParam)
EndFunc   ;==>FKEY

Func FMOUSE($nCode, $wParam, $lParam)
	If $nCode >= 0 Then
		Switch $wParam
			Case 0x0200 ; $WM_MOUSEMOVE
				; начало добавленого
				Local $sRect = DllStructCreate("Int[2]", $lParam), _
						$CURX = DllStructGetData($sRect, 1, 1), _
						$CURY = DllStructGetData($sRect, 1, 2)
				; конец добавленого

				If $FPOS Then
					$FPOS = False
				Else
					$CURM += Floor(Sqrt(($OLDX - $CURX)^2 + ($OLDY - $CURY)^2))
				EndIf
				$OLDX = $CURX
				$OLDY = $CURY
				$COUNTMOVE = Floor($CURM / 96 * 2.54)
				
			Case 0x0201, 0x0204, 0x0207 ; WM_LBUTTONDOWN, WM_RBUTTONDOWN, WM_MBUTTONDOWN
				$COUNTCLICK += 1
		EndSwitch
	EndIf
	Return DllCall($dll, "long", "CallNextHookEx", "hwnd", $HMOUSE[0], "int", $nCode, "ptr", $wParam, "ptr", $lParam)
EndFunc   ;==>FMOUSE

Func QUIT()
	DllCallbackFree($SKEY)
	DllCall($dll, "int", "UnhookWindowsHookEx", "hwnd", $HKEY[0])
	DllCallbackFree($SMOUSE)
	DllCall($dll, "int", "UnhookWindowsHookEx", "hwnd", $HMOUSE[0])
	DllClose($dll)
EndFunc   ;==>QUIT

Я заметил что в некоторых "WM-Сообщений Windows" есть вариант с BitShift и BitAND, а в других структура с данными. При тесте выяснил, что данные координат для данного случая содержатся в первых двух.

Посмотри, сделал небольшую оптимизацию, заменил на Switch, объединил Case, объединил условие "If", использовал DllOpen, поставил Sleep(100)
Поставил Sleep(100), потому что была нагрузка на процессор 10-20%, а так как мы всё равно не читаем TrayTip 100 раз в секунду, то нет смысла так часто обновлять. На функции это не влияет, они обрабатываются самостоятельно.
 
Автор
snoitaleR

snoitaleR

AutoIT Гуру
Сообщения
854
Репутация
223
AZJIO
Спасибо за помощь... :smile:
 
Верх