Что нового

Помогите настроить так,чтобы по часам в скрипте происходило нажатие на клавишу

TiranCool

Новичок
Сообщения
78
Репутация
0
Код:
#include <GUIConstantsEx.au3> ; Включение указанного файла внутрь текущего сценария.
  ;- Окно ------------------------------
  GUICreate("Часы", 155, 111, 192, 114)
  GUISetState()
  ;-------------------------------------
  ;- Часы -------------------------------------------------------------
  AdlibRegister("MainScript", 10) ; Обновление часов
  $Clock = GUICtrlCreateLabel(@HOUR & ":" & @MIN & ":" & @SEC & ":" & @MSEC, 50, 20)
  ;--------------------------------------------------------------------
  ;- Настройки ---------------------
  While 1
      $nMsg = GUIGetMsg()
      Switch $nMsg
          Case $GUI_EVENT_CLOSE
              Exit
      EndSwitch
  WEnd
  ;---------------------------------
  ;- Сверка часов с компьютером -----------------------------
  Func MainScript()
      GUICtrlSetData($Clock, @HOUR & ":" & @MIN & ":" & @SEC& ":" & @MSEC)
   EndFunc
  ;------------------------------------------------------------



Нужно нажатие на клавишу PrntSc,заранее спасибо
А лучше,если часы будут работать от сервера!!)))
 

Вложения

  • часы.au3
    1 КБ · Просмотры: 4
A

Alofa

Гость
Этого объяснения мало.
- Вам нужно именно нажать на клавишу или сделать скриншот?
- С какой периодичностью?
 
Автор
T

TiranCool

Новичок
Сообщения
78
Репутация
0
Нужно сделать скриншот времени,если есть возможность сделать так,что в данном скрипте время будет идти к примеру с данного сервера времени NTP,то мне нужно,чтобы нажатие кнопки PrntSc нажималась в то время,которое я хочу.вот пример:
Код:
sleep(5000)
While 1
   if (@HOUR = 13) and  (@MIN= 00) and  (@SEC= 59)  Then   
   Sleep(1000)  
   Send("{PRINTSCREEN}")
   Sleep(1000)
   Endif
   Sleep(10)
WEnd

но у меня не получается выставить MSEС
 
A

Alofa

Гость
TiranCool сказал(а):
... но у меня не получается выставить MSEС
Создание скринов и обновление времени через NTP с точностью до миллисекунды? Ну вы это загнули ;D

Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <StructureConstants.au3>
#include <ScreenCapture.au3>
#include <Array.au3>
#include <Date.au3>

Global $sNTP = 'ntp1.stratum2.ru' ; Сервер NTP
Global $iTimeInterval = 300 ; Интервал обновления времени в миллисекундах
Global $vDateTime = '2016/07/29 20:46:10' ; Время создания скриншотА (формат ГГГ/MM/ДД чч:мм:сс:мсс)
Global $sDir = @ScriptDir ; Папка для скриншотов
Global $iTimePrev, $iScrTime

$aDT = StringRegExp($vDateTime, '(\d{4})/(\d{2})/(\d{2})\h(\d{2}):(\d{2}):(\d{2})', 3)
If @error Or UBound($aDT) <> 6 Then Exit MsgBox(4096+16, 'Ошибка!', 'Задайте правильно время создания скриншота.')
$vDateTime = Number(_ArrayToString($aDT, ''))

Global $hGui = GUICreate("Часы", 155, 111, -1, -1, -1, $WS_EX_TOPMOST)
AdlibRegister("MainScript", $iTimeInterval) ; Обновление часов
$Clock = GUICtrlCreateLabel(@HOUR & ":" & @MIN & ":" & @SEC, 50, 20)
GUISetState()

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
	EndSwitch
	If $iScrTime >= $vDateTime Then
		_ScreenCapture_CaptureWnd($sDir & '\My_Screen[' & $iScrTime & '].jpg', $hGui)
		$vDateTime *= 2
	EndIf
WEnd

Func MainScript()
	Local $aFT, $sTime, $tFT = _NTP_FT($sNTP)
	If Not @error Then
		$aFT = _Date_Time_FileTimeToArray($tFT)
		If UBound($aFT) >= 6 Then
			$sTime = StringFormat('%02d:%02d:%02d', $aFT[3], $aFT[4], $aFT[5])
			If $sTime <> $iTimePrev Then
				GUICtrlSetData($Clock, $sTime)
				$iTimePrev = $sTime
			EndIf
			$iScrTime = Number(StringFormat('%04d%02d%02d%02d%02d%02d', $aFT[2], $aFT[0], $aFT[1], $aFT[3], $aFT[4], $aFT[5]))
		EndIf
	EndIf
EndFunc   ;==>MainScript

Func _NTP_FT($sServer, $fLocal = True) ; Параметр $fLocal:	True - возвращается локальное время
;~															False - возвращается время UTC
	
;~ 	Тема: http://autoit-script.ru/index.php?topic=20487.0
;~ 	Справка: http://book.itep.ru/4/44/sntp4416.htm

	Local $tNTP = DllStructCreate('byte Header[4];byte RootDelay[4];byte RootDispersion[4];byte ReferenceIdentifier[4];byte ReferenceTimestamp[8];byte OriginateTimestamp[8];byte ReceiveTimestamp[8];byte TransmitTimestamp[8];byte KeyIdentifier[4];byte MessageDigest[16]')
	Local $tPacket = DllStructCreate('byte Packet[68]', DllStructGetPtr($tNTP))
	Local $bPacket = 0, $tFT, $tQW, $aSocket, $aResult

	$tNTP.Header = Binary('0x1B000000')
	UDPStartup()
	If @error Then Return SetError(1, 0, 0)

	$aSocket = UDPOpen(TCPNameToIP($sServer), 123)
	If Not @error Then
		UDPSend($aSocket, $tPacket.Packet)
		If Not @error Then
			While 1
				$bPacket = UDPRecv($aSocket, 68, 1)
				If (@error) Or ($bPacket) Then ExitLoop
				Sleep(100)
			WEnd
		EndIf
	EndIf
	
	UDPCloseSocket($aSocket)
	UDPShutdown()
	If Not $bPacket Then Return SetError(2, 0, 0)

	$tFT = DllStructCreate($tagFILETIME)
	$tQW = ($fLocal ? DllStructCreate('uint64 Timestamp') : DllStructCreate('uint64 Timestamp', DllStructGetPtr($tFT)))
	
	$tPacket.Packet = $bPacket
;~  $tQW.Timestamp = _WinAPI_SwapDWord(DllStructGetData(DllStructCreate('uint', DllStructGetPtr($tNTP, 'TransmitTimestamp')), 1)) * 10000000 + 94354848000000000
	$tQW.Timestamp = Dec(StringMid(DllStructGetData($tNTP, 'TransmitTimestamp'), 3, 8), 2) * 10000000 + 94354848000000000
	If $fLocal Then
		$aResult = DllCall('kernel32.dll', 'bool', 'FileTimeToLocalFileTime', 'struct*', $tQW, "struct*", $tFT)
		If (@error) Or (Not $aResult[0]) Then Return SetError(3, 0, 0)
	EndIf
	Return $tFT
EndFunc   ;==>_NTP_FT
 
Автор
T

TiranCool

Новичок
Сообщения
78
Репутация
0
Круто спасибо,а как сделать мсек и как ставить время в которое он должен делать скрин,и можно ли нажимать на другую кнопку?)))
 
A

Alofa

Гость
TiranCool сказал(а):
... а как сделать мсек
Вот не пойму зачем вам милли-то секунды? Пока делается скриншот уже четверть секунды пройдет + пока ответ придет от сервера мсек тоже будут не те.

TiranCool сказал(а):
... как ставить время в которое он должен делать скрин
Подправил скрипт.

TiranCool сказал(а):
... можно ли нажимать на другую кнопку?)))
Какую кнопку? В вашем скрипте вообще кнопок нет.

А вообще парадокс делать скриншот времени по этому же самому времени :shok:
 
Автор
T

TiranCool

Новичок
Сообщения
78
Репутация
0
сейчас переделываю для кликера,на кнопку Ентер нажимать по времени))),вот надо изменить кнопку,а скрин тоже нужен))),но отдельно
 
A

Alofa

Гость
Для достижения большей точности в вычислении времени я бы вам предложил в самом начале выполнения скрипта всего 1 раз синхронизировать через NTP системное время и дальше уже скакать от него.

TiranCool сказал(а):
... на кнопку Ентер нажимать по времени)))...
Если вы это собираетесь делать одновременно со скриншотом, по средствам Send()-подобных функций, то вставьте ее сразу же после:
Код:
_ScreenCapture_CaptureWnd($sDir & '\My_Screen[' & $iScrTime & '].jpg', $hGui)
 
Автор
T

TiranCool

Новичок
Сообщения
78
Репутация
0
Нет вы не поняли,одна есть,теперь без скриншота,чисто на Ентер нажимать надо и все
 
Автор
T

TiranCool

Новичок
Сообщения
78
Репутация
0
Он делает скриншот самого окнам времени,а надо скриншот активного окна
 
Автор
T

TiranCool

Новичок
Сообщения
78
Репутация
0
Не могу данный мод переделать,теперь надо чтобы он "нажимал" на клавишу ентер в такое то время,но нужно с MSEC или со Sleep,скриншоты не нужны больше,осталось только вот это сделать и все


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

на ентер нажимать в любом активном окне,например на сайте каком то,или на рабочем столе к примеру выделен одним климом файл,а его по времени запустить и тд
 
A

Alofa

Гость
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <Array.au3>

Local $sNTP = 'ntp1.stratum2.ru' ; Сервер NTP
Local $vDateTime = '23:32:20:333' ; Время нажатия "Enter" (формат чч:мм:сс:мсс)

$aDT = StringRegExp($vDateTime, '(\d{2}):(\d{2}):(\d{2}):(\d{3})', 3)
If @error Or UBound($aDT) <> 4 Then Exit MsgBox(4096 + 16, 'Ошибка!', 'Задайте правильно время.')
$vDateTime = Number(_ArrayToString($aDT, ''))

Local $hGui = GUICreate("Часы", 155, 111, -1, -1, -1, $WS_EX_TOPMOST)
Local $Clock = GUICtrlCreateLabel(@HOUR & ":" & @MIN & ":" & @SEC & ":" & @MSEC, 50, 20)
GUISetState()

While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			Exit
	EndSwitch
	
	If $vDateTime Then
		$iScrTime = Number(@HOUR & @MIN & @SEC & @MSEC)
		GUICtrlSetData($Clock, @HOUR & ":" & @MIN & ":" & @SEC & ":" & @MSEC)
		If $vDateTime < $iScrTime Then
			Send('{ENTER}')
			GUICtrlSetColor($Clock, 0xFF0004)
			SoundPlay(@WindowsDir & '\media\tada.wav')
			$vDateTime = False
		EndIf
	Else
		Sleep(20)
	EndIf
WEnd
 
Автор
T

TiranCool

Новичок
Сообщения
78
Репутация
0
Код:
#include <GUIConstants.au3>
#include <DateTimeConstants.au3>

Opt('TrayMenuMode', 3)

Local $sTimeText, $sSleepText, $iTrigger = False
Local $hGui, $hTime, $hSleep, $Button_1, $Button_2, $hTrayItem_1, $hTrayItem_2

$hGui = GUICreate('', 189, 222)

GUICtrlCreateLabel('Время', 64, 16, 37, 17)
GUICtrlCreateLabel('Задержка', 64, 80, 55, 17)
$hTime = GUICtrlCreateDate('', 45, 40, 95, 25, $DTS_TIMEFORMAT)
GUICtrlSetFont(-1, 11)
$hSleep = GUICtrlCreateInput('800', 45, 104, 95, 25, $ES_CENTER)
GUICtrlSetFont(-1, 11)
$Button_1 = GUICtrlCreateButton('Запуск', 56, 136, 75, 25, 0)
$Button_2 = GUICtrlCreateButton('Скрыть окно', 56, 176, 75, 25, 0)

$hTrayItem_1 = TrayCreateItem('Скрыть/Восстановить окно')
$hTrayItem_2 = TrayCreateItem('Выход')
GUISetState(@SW_SHOW)

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            Exit
        Case $Button_2
            GUISetState(@SW_HIDE)
        Case $Button_1
            If GUICtrlRead($Button_1) == 'Запуск' Then
                _Button_1('Отмена', $GUI_DISABLE)
            Else
                _Button_1('Запуск', $GUI_ENABLE)
            EndIf
    EndSwitch

    Switch TrayGetMsg()
        Case $hTrayItem_1
            If BitAND(WinGetState($hGui), 2) Then
                GUISetState(@SW_HIDE)
            Else
                GUISetState(@SW_SHOW)
            EndIf
        Case $hTrayItem_2
            Exit
    EndSwitch

    If $iTrigger And @HOUR & @MIN & @SEC = $sTimeText Then ExitLoop
WEnd

;MsgBox(64, 'Отчет', 'Будильник сработал!' & @LF & 'Текущее время: ' & @HOUR & ':' & @MIN & ':' & @SEC)
Sleep($sSleepText)
Send('{Enter}')
GUIDelete($hGui)



Func _Button_1($sText, $iState)
    If Not $iTrigger Then
        $sSleepText = GUICtrlRead($hSleep)
        $sTimeText = GUICtrlRead($hTime)
        $sTimeText = StringReplace($sTimeText, ':', '')
        $sTimeText = StringFormat("%06s", $sTimeText)
    EndIf
    $iTrigger = Not $iTrigger

    GUICtrlSetData($Button_1, $sText)
    GUICtrlSetState($hTime, $iState)
    GUICtrlSetState($hSleep, $iState)
EndFunc

вот сделал немного,но хотелось бы добавить время сервера и чтобы срабатывание времени было по времени сервера,тогда можно убрать задержку
 
Верх