• 欢迎访问奇跡の海网站,本站不上传任何资源,所有资源均来自于网络,欢迎加入奇跡の海~!奇跡の海-WordPress QQ群
  • 本站下载资源为网络上收集整理而来,并且以计算机技术研究交流为目的,版权归原作者所有,仅供大家参考,学习,不存在任何商业目的与商业用途.
  • 本站系统镜像均来自于官方原版,ed2k可视为P2P下载链接。所有操作系统默认均为试用版,如有正版密钥可以有效激活,本站不提供任何激活和相关服务。

AutoIt3(au3)源码-时间校准工具源码

AutoIT3 奇跡の海 2年前 (2017-11-05) 2158次浏览 已收录 0个评论 扫描二维码

源码简介

AutoIt3(au3)源码-时间校准工具源码
时间校准工具源码,使用前先链接网络,再执行

源代码

#NoTrayIcon
#RequireAdmin
#Region ;**** 参数创建于 ACNWrapper_GUI ****
#AutoIt3Wrapper_icon=项目1.ico
#AutoIt3Wrapper_outfile=C:\Users\Administrator\时间校准.exe
#AutoIt3Wrapper_Compression=4
#AutoIt3Wrapper_UseUpx=n
#AutoIt3Wrapper_Res_Comment=仅供内部使用!
#AutoIt3Wrapper_Res_Description=时间校准工具
#AutoIt3Wrapper_Res_Fileversion=13.8.3.3
#AutoIt3Wrapper_Res_Fileversion_AutoIncrement=y
#AutoIt3Wrapper_Res_LegalCopyright=QQ:411933069
#EndRegion ;**** 参数创建于 ACNWrapper_GUI ****
#include <ButtonConstants.au3>
#include <GuiStatusBar.au3>
#include <GUIConstantsEx.au3>
#include <Timers.au3>
#include 'CoProc.au3'
#include <Misc.au3>
#include <Date.au3>

Opt("WinTitleMatchMode", 2);标题的任意子串皆可匹配
Opt("GUICloseOnESC", 0);在按下 ESC 时不退出

Dim $dll, $StatusBar1_PartsWidth[1] = [350]
Global $MyDate, $MyTime
FileInstall("logo.BMP", @TempDir & "\logo.BMP", 1)
FileInstall("Skin.dll", @TempDir & "\Skin.dll", 1)
FileInstall("hlong.she", @TempDir & "\hlong.she", 1)
$Form1 = @TempDir & "\hlong.she"
$dll = DllOpen(@TempDir & "\Skin.dll")
DllCall($dll, "int", "SkinH_AttachEx", "str", $Form1, "str", "mhgd")
DllCall($dll, "int", "SkinH_SetAero", "int", 0)

$Form1 = GUICreate("电脑时间校准工具", 400, 180) ; 创建一个居中显示的 GUI 窗口

$StatusBar1 = _GUICtrlStatusBar_Create($Form1)
_GUICtrlStatusBar_SetParts($StatusBar1, $StatusBar1_PartsWidth)
_GUICtrlStatusBar_SetText($StatusBar1, " 当前电脑时间:" & today() & StringFormat("%02d:%02d:%02d", @HOUR, @MIN, @SEC), 0)
_GUICtrlStatusBar_SetIcon($StatusBar1, 0, _WinAPI_LoadShell32Icon(15));设置状态栏图标
_Timer_SetTimer($Form1, 1000, "_UpdateStatusBarClock")
_GUICtrlStatusBar_SetMinHeight($StatusBar1, 10)
$logo = GUICtrlCreatePic(@TempDir & "\logo.BMP", 10, 28, 64, 64)
GUICtrlSetTip(-1, "点击查看网页上的北京时间!", "", "", 1)
GUICtrlSetCursor(-1, 0)
$Label2 = GUICtrlCreateLabel("用于网络校时服务,同步校准你的电脑时间,", 90, 30, 290, 20)
GUICtrlSetFont(-1, 11, 400, 1, "黑体")
$Label3 = GUICtrlCreateLabel("使用时请先连接互联网,点击开始校准时间按钮。", 90, 58, 360, 20)
GUICtrlSetFont(-1, 11, 400, 1, "黑体")
$Label3 = GUICtrlCreateLabel("欢迎使用本地系统时间校准工具!", 90, 85, 253, 20)
GUICtrlSetFont(-1, 11, 400, 1, "黑体")

$Button1 = GUICtrlCreateButton("自动校准时间", 90, 120, 160, 25)
GUICtrlSetFont(-1, 11, 400, 1, "黑体")
$Button2 = GUICtrlCreateButton("退出软件", 280, 120, 100, 25)
GUICtrlSetFont(-1, 11, 400, 1, "黑体")
GUISetState(@SW_SHOW)
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE, $Button2
QUIT()
Case $logo
ShellExecute("http://tools.2345.com/timebj/")
Case $Button1
_Timecheck()
EndSwitch
WEnd
Func _UpdateStatusBarClock($hWnd, $msg, $iIDTimer, $dwTime)
_GUICtrlStatusBar_SetText($StatusBar1, " 当前电脑时间:" & today() & StringFormat("%02d:%02d:%02d", @HOUR, @MIN, @SEC))
EndFunc ;==>_UpdateStatusBarClock

Func today()
Return (@YEAR & "年" & [url=home.php?mod=space&uid=611857]@mon[/url] & "月" & @MDAY & "日")
EndFunc ;==>today



Func _Timecheck()
If Ping('www.2345.com', 500) Then
$_Now_date = _GetSrv_Date()
_DateTimeSplit($_Now_date, $MyDate, $MyTime)
_SetDate($MyDate[3], $MyDate[2], $MyDate[1])
_SetTime($MyTime[1], $MyTime[2], $MyTime[3])
MsgBox(64, "电脑时间校准", "" & @CR & " -------时间校准完成!-------" _
& @CR & @CR & " 现在您的电脑时间已经和北京时间同步! " & @CR & @CR & " 现在时间:" & $_Now_date, 30, "")
Else
If Ping('www.baidu.com', 500) Then
$_Now_date = _GetSrv_Date()
_DateTimeSplit($_Now_date, $MyDate, $MyTime)
_SetDate($MyDate[3], $MyDate[2], $MyDate[1])
_SetTime($MyTime[1], $MyTime[2], $MyTime[3])
MsgBox(64, "电脑时间校准", "" & @CR & " -------时间校准完成!-------" _
& @CR & @CR & " 现在您的电脑时间已经和北京时间同步! " & @CR & @CR & " 现在时间:" & $_Now_date, 30, "")
Else
MsgBox(16, "出错啦", "网络已断开,连接服务器失败!请保持联网状态,再进行时间校准。 ", 5, "")
EndIf
EndIf
EndFunc ;==>_Timecheck


Func _GetSrv_Date()
Local $_Srvlist[8] = ["time-nw.nist.gov", _
"time-a.nist.gov", _
"time-b.nist.gov", _
"time-a.timefreq.bldrdoc.gov", _
"time-b.timefreq.bldrdoc.gov", _
"time-c.timefreq.bldrdoc.gov", _
"utcnist.colorado.edu", _
"time.nist.gov"]
UDPStartup()
Local $_Time_Srv
For $x = 0 To UBound($_Srvlist) - 1
$_Time_Srv = $_Srvlist[$x]
Local $socket = UDPOpen(TCPNameToIP($_Time_Srv), 123)
If @error <> 0 Then ContinueLoop
$status = UDPSend($socket, MakePacket())
If $status = 0 Then ContinueLoop
Local $Data = "", $i = 0
While $Data = ""
$i += 1
$Data = UDPRecv($socket, 100)
If $i = 5 Then ContinueLoop (2)
Sleep(88)
WEnd
UDPCloseSocket($socket)
UDPShutdown()
ExitLoop
Next
If $Data = "" Then Return 0
$Data = UnsignedHexToDec(StringMid($Data, 83, 8))
$Data = _DateTimeFormat(_DateAdd("s", $Data, "1900/01/01 08:00:00"), 0)
Return $Data
EndFunc ;==>_GetSrv_Date


Func MakePacket()
Local $P, $D = "1b0e01000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000"
While $D
$P &= Chr(Dec(StringLeft($D, 2)))
$D = StringTrimLeft($D, 2)
WEnd
Return $P
EndFunc ;==>MakePacket



Func UnsignedHexToDec($_Data)
Return Dec(StringTrimRight($_Data, 1)) * 16 + Dec(StringRight($_Data, 1))
EndFunc ;==>UnsignedHexToDec

Func QUIT()
GUISetState(@SW_HIDE)
DllCall($dll, "int", "SkinH_Detach")
DllClose($dll)
FileDelete(@TempDir & "\LOGO.bmp")
Exit
EndFunc ;==>QUIT

CoProc.au3

#cs
	User Calltips:
	_CoProc([$sFunction],[$vParameter]) Starts another Process and Calls $sFunc, Returns PID
	_SuperGlobalSet($sName,[$vValue],[$sRegistryBase]) Sets or Deletes a Superglobal Variable
	_SuperGlobalGet($sName,[$fOption],[$sRegistryBase]) Returns the Value of a Superglobal Variable
	_ProcSuspend($vProcess) Suspends all Threads in $vProcess (PID or Name)
	_ProcResume($vProcess) Resumes all Threads in $vProcess (PID or Name)
	_ProcessGetWinList($vProcess, $sTitle = Default, $iOption = 0) Enumerates Windows of a Process
	_CoProcReciver([$sFunction = ""]) Register/Unregister Reciver Function
	_CoProcSend($vProcess, $vParameter,[$iTimeout = 500],[$fAbortIfHung = True]) Send Message to Process
	_ConsoleForward($iPid1, [$iPid2], [$iPid3], [$iPidn])
	_ProcessEmptyWorkingSet($vPid = @AutoItPID,[$hDll_psapi],[$hDll_kernel32]) Removes as many pages as possible from the working set of the specified process.
	_DuplicateHandle($dwSourcePid, $hSourceHandle, $dwTargetPid = @AutoItPID, $fCloseSource = False) Returns a Duplicate handle
	_CloseHandle($hAny) Close a Handle
	$gs_SuperGlobalRegistryBase
	$gi_CoProcParent
#ce

Global $gs_SuperGlobalRegistryBase = "HKEY_CURRENT_USER\Software\AutoIt v3\CoProc"
Global $gi_CoProcParent = 0
Global $gs_CoProcReciverFunction = ""
Global $gv_CoProcReviverParameter = 0

;===============================================================================
;
; Description:      Starts another Process
; Parameter(s):     $sFunction - Optional, Name of Function to start in the new Process
;					$vParameter - Optional, Parameter to pass
; Requirement(s):   3.2.4.9
; Return Value(s):  On Success - Pid of the new Process
;                   On Failure - Set @error to 1
; Author(s):        Florian 'Piccaso' Fida
; Note(s):			Inside the new Process $gi_CoProcParent holds the PID of the Parent Process.
;					$vParameter must not be Binary, an Array or DllStruct.
;					If $sFunction is a just a function name Like _CoProc("MyFunc","MyParameter") Then
;					Call() will be used to Call the function and optional pass the Parameter (only one).
;					If $sFunction is a expression like _CoProc("MyFunc('MyParameter')") Then
;					Execute() will be used to evaluate this expression makeing more than one Parameter Possible.
;					In the 'Execute()' Case the $vParameter Parameter will be ignored.
;					In both cases there are Limitations, Read doc's (for Execute() and Call()) for more detail.
;
;					If $sFunction is Empty ("" or Default) $vParameter can be the name of a Reciver function.
;
;
;===============================================================================
Func _CoProc($sFunction = Default, $vParameter = Default)
	Local $iPid, $iOldRunErrorsFatal
	If IsKeyword($sFunction) Or $sFunction = "" Then $sFunction = "__CoProcDummy"
	EnvSet("CoProc", "0x" & Hex(StringToBinary ($sFunction)))
	EnvSet("CoProcParent", @AutoItPID)
	If Not IsKeyword($vParameter) Then
		EnvSet("CoProcParameterPresent", "True")
		EnvSet("CoProcParameter", StringToBinary ($vParameter))
	Else
		EnvSet("CoProcParameterPresent", "False")
	EndIf
	If @Compiled Then
		$iPid = Run(FileGetShortName(@AutoItExe), @WorkingDir, @SW_HIDE, 1 + 2 + 4)
	Else
		$iPid = Run(FileGetShortName(@AutoItExe) & ' "' & @ScriptFullPath & '"', @WorkingDir, @SW_HIDE, 1 + 2 + 4)
	EndIf
	If @error Then SetError(1)
	Return $iPid
EndFunc   ;==>_CoProc


;===============================================================================
;
; Description:      Set a Superglobal Variable
; Parameter(s):     $sName - Identifyer for the Superglobal Variable
;					$vValue - Value to be Stored (optional)
;					$sRegistryBase - Registry Base Key (optional)
; Requirement(s):   3.2.4.9
; Return Value(s):  On Success - Returns True
;                   On Failure - Returns False and Set
;												@error to:	1 - Wrong Value Type
;															2 - Registry Problem
; Author(s):        Florian 'Piccaso' Fida
; Note(s):			$vValue must not be an Array or Struct.
;					if $vValue is Omitted the Superglobal Variable will be deleted.
;
;					Superglobal Variables are Stored in the Registry.
;					$gs_SuperGlobalRegistryBase is holding the Default Base Key
;
;===============================================================================
Func _SuperGlobalSet($sName, $vValue = Default, $sRegistryBase = Default)
	Local $vTmp
	If $sRegistryBase = Default Then $sRegistryBase = $gs_SuperGlobalRegistryBase
	If $vValue = "" Or $vValue = Default Then
		RegDelete($sRegistryBase, $sName)
		If @error Then Return SetError(2, 0, False) ; Registry Problem
	Else
		RegWrite($sRegistryBase, $sName, "REG_BINARY", StringToBinary ($vValue))
		If @error Then Return SetError(2, 0, False) ; Registry Problem
	EndIf
	Return True
EndFunc   ;==>_SuperGlobalSet

;===============================================================================
;
; Description:      Get a Superglobal Variable
; Parameter(s):     $sName - Identifyer for the Superglobal Variable
;					$fOption - Optional, if True The Superglobal Variable will be deleted after sucessfully Reading it out
;					$sRegistryBase - Registry Base Key (optional)
; Requirement(s):   3.2.4.9
; Return Value(s):  On Success - Returns the Value of the Superglobal Variable
;                   On Failure - Set
;								@error to:	1 - Not Found / Registry Problem
;											2 - Error Deleting
; Author(s):        Florian 'Piccaso' Fida
; Note(s):			$vValue must not be an Array or Struct.
;					Superglobal Variables are Stored in the Registry.
;					$gs_SuperGlobalRegistryBase is holding the Default Base Key
;
;===============================================================================
Func _SuperGlobalGet($sName, $fOption = Default, $sRegistryBase = Default)
	Local $vTmp
	If $fOption = "" Or $fOption = Default Then $fOption = False
	If $sRegistryBase = Default Then $sRegistryBase = $gs_SuperGlobalRegistryBase
	$vTmp = RegRead($sRegistryBase, $sName)
	If @error Then Return SetError(1, 0, "") ; Registry Problem
	If $fOption Then
		_SuperGlobalSet($sName)
		If @error Then SetError(2)
	EndIf
	Return BinaryToString ("0x" & $vTmp)
EndFunc   ;==>_SuperGlobalGet

;===============================================================================
;
; Description:      Suspend all Threads in a Process
; Parameter(s):     $vProcess - Name or PID of Process
; Requirement(s):   3.1.1.130, Win ME/2k/XP
; Return Value(s):  On Success - Returns Nr. of Threads Suspended and Set @extended to Nr. of Threads Processed
;                   On Failure - Returns False and Set
;												@error to:	1 - Process not Found
;															2 - Error Calling 'CreateToolhelp32Snapshot'
;															3 - Error Calling 'Thread32First'
;															4 - Error Calling 'Thread32Next'
;															5 - Not all Threads Processed
; Author(s):        Florian 'Piccaso' Fida
; Note(s):			Ported from: http://www.codeproject.com/threads/pausep.asp
;					Better read the article (and the warnings!) if you want to use it :)
;
;===============================================================================
Func _ProcSuspend($vProcess, $iReserved = 0)
	Local $iPid, $vTmp, $hThreadSnap, $ThreadEntry32, $iThreadID, $hThread, $iThreadCnt, $iThreadCntSuccess, $sFunction
	Local $TH32CS_SNAPTHREAD = 0x00000004
	Local $INVALID_HANDLE_VALUE = 0xFFFFFFFF
	Local $THREAD_SUSPEND_RESUME = 0x0002
	Local $THREADENTRY32_StructDef = "int;" _; 1 -> dwSize
			 & "int;" _; 2 -> cntUsage
			 & "int;" _; 3 -> th32ThreadID
			 & "int;" _; 4 -> th32OwnerProcessID
			 & "int;" _; 5 -> tpBasePri
			 & "int;" _; 6 -> tpDeltaPri
			 & "int" ; 7 -> dwFlags
	$iPid = ProcessExists($vProcess)
	If Not $iPid Then Return SetError(1, 0, False) ; Process not found.
	$vTmp = DllCall("kernel32.dll", "ptr", "CreateToolhelp32Snapshot", "int", $TH32CS_SNAPTHREAD, "int", 0)
	If @error Then Return SetError(2, 0, False) ; CreateToolhelp32Snapshot Failed
	If $vTmp[0] = $INVALID_HANDLE_VALUE Then Return SetError(2, 0, False) ; CreateToolhelp32Snapshot Failed
	$hThreadSnap = $vTmp[0]
	$ThreadEntry32 = DllStructCreate($THREADENTRY32_StructDef)
	DllStructSetData($ThreadEntry32, 1, DllStructGetSize($ThreadEntry32))
	$vTmp = DllCall("kernel32.dll", "int", "Thread32First", "ptr", $hThreadSnap, "long", DllStructGetPtr($ThreadEntry32))
	If @error Then Return SetError(3, 0, False) ; Thread32First Failed
	If Not $vTmp[0] Then
		DllCall("kernel32.dll", "int", "CloseHandle", "ptr", $hThreadSnap)
		Return SetError(3, 0, False) ; Thread32First Failed
	EndIf
	While 1
		If DllStructGetData($ThreadEntry32, 4) = $iPid Then
			$iThreadID = DllStructGetData($ThreadEntry32, 3)
			$vTmp = DllCall("kernel32.dll", "ptr", "OpenThread", "int", $THREAD_SUSPEND_RESUME, "int", False, "int", $iThreadID)
			If Not @error Then
				$hThread = $vTmp[0]
				If $hThread Then
					If $iReserved Then
						$sFunction = "ResumeThread"
					Else
						$sFunction = "SuspendThread"
					EndIf
					$vTmp = DllCall("kernel32.dll", "int", $sFunction, "ptr", $hThread)
					If $vTmp[0] <> -1 Then $iThreadCntSuccess += 1
					DllCall("kernel32.dll", "int", "CloseHandle", "ptr", $hThread)
				EndIf
			EndIf
			$iThreadCnt += 1
		EndIf
		$vTmp = DllCall("kernel32", "int", "Thread32Next", "ptr", $hThreadSnap, "long", DllStructGetPtr($ThreadEntry32))
		If @error Then Return SetError(4, 0, False) ; Thread32Next Failed
		If Not $vTmp[0] Then ExitLoop
	WEnd
	DllCall("kernel32.dll", "int", "CloseToolhelp32Snapshot", "ptr", $hThreadSnap) ; CloseHandle
	If Not $iThreadCntSuccess Or $iThreadCnt > $iThreadCntSuccess Then Return SetError(5, $iThreadCnt, $iThreadCntSuccess)
	Return SetError(0, $iThreadCnt, $iThreadCntSuccess)
EndFunc   ;==>_ProcSuspend

;===============================================================================
;
; Description:      Resume all Threads in a Process
; Parameter(s):     $vProcess - Name or PID of Process
; Requirement(s):   3.1.1.130, Win ME/2k/XP
; Return Value(s):  On Success - Returns Nr. of Threads Resumed and Set @extended to Nr. of Threads Processed
;                   On Failure - Returns False and Set
;												@error to:	1 - Process not Found
;															2 - Error Calling 'CreateToolhelp32Snapshot'
;															3 - Error Calling 'Thread32First'
;															4 - Error Calling 'Thread32Next'
;															5 - Not all Threads Processed
; Author(s):        Florian 'Piccaso' Fida
; Note(s):			Ported from: http://www.codeproject.com/threads/pausep.asp
;					Better read the article (and the warnings!) if you want to use it :)
;
;===============================================================================
Func _ProcResume($vProcess)
	Local $fRval = _ProcSuspend($vProcess, True)
	Return SetError(@error, @extended, $fRval)
EndFunc   ;==>_ProcResume

;===============================================================================
;
; Description:      Enumerates Windows of a Process
; Parameter(s):     $vProcess - Name or PID of Process
;					$sTitle - Optional Title of window to Find
;					$iOption - Optional, Can be added together
;								0 - Matches any Window (Default)
;								2 - Matches any Window Created by GuiCreate() (ClassName: AutoIt v3 GUI)
;								4 - Matches AutoIt Main Window (ClassName: AutoIt v3)
;								6 - Matches Any AutoIt Window
;								16 - Return the first Window Handle found (No Array)
; Requirement(s):   3.1.1.130
; Return Value(s):  On Success - Retuns an Array/Handle of Windows found
;                   On Failure - Set @ERROR to:	1 - Process not Found
;												2 - Window(s) not Found
;												3 - GetClassName Failed
; Author(s):        Florian 'Piccaso' Fida
; Note(s):
;
;===============================================================================
Func _ProcessGetWinList($vProcess, $sTitle = Default, $iOption = 0)
	Local $aWinList, $iCnt, $aTmp, $aResult[1], $iPid, $fMatch, $sClassname
	$iPid = ProcessExists($vProcess)
	If Not $iPid Then Return SetError(1) ; Process not Found
	If $sTitle = "" Or IsKeyword($sTitle) Then
		$aWinList = WinList()
	Else
		$aWinList = WinList($sTitle)
	EndIf
	For $iCnt = 1 To $aWinList[0][0]
		$hWnd = $aWinList[$iCnt][1]
		$iProcessId = WinGetProcess($hWnd)
		If $iProcessId = $iPid Then
			If $iOption = 0 Or IsKeyword($iOption) Or $iOption = 16 Then
				$fMatch = True
			Else
				$fMatch = False
				$sClassname = DllCall("user32.dll", "int", "GetClassName", "hwnd", $hWnd, "str", "", "int", 1024)
				If @error Then Return SetError(3) ; GetClassName
				If $sClassname[0] = 0 Then Return SetError(3) ; GetClassName
				$sClassname = $sClassname[2]
				If BitAND($iOption, 2) Then
					If $sClassname = "AutoIt v3 GUI" Then $fMatch = True
				EndIf
				If BitAND($iOption, 4) Then
					If $sClassname = "AutoIt v3" Then $fMatch = True
				EndIf
			EndIf
			If $fMatch Then
				If BitAND($iOption, 16) Then Return $hWnd
				ReDim $aResult[UBound($aResult) + 1]
				$aResult[UBound($aResult) - 1] = $hWnd
			EndIf
		EndIf
	Next
	$aResult[0] = UBound($aResult) - 1
	If $aResult[0] < 1 Then Return SetError(2, 0, 0) ; No Window(s) Found
	Return $aResult
EndFunc   ;==>_ProcessGetWinList

;===============================================================================
;
; Description:      Register Reciver Function
; Parameter(s):     $sFunction - Optional, Function name to Register.
;								Omit to Disable/Unregister
; Requirement(s):   3.2.4.9
; Return Value(s):  On Success - Returns True
;                   On Failure - Returns False and Set
;												@error to:	1 - Unable to create Reciver Window
;															2 - Unable to (Un)Register WM_COPYDATA or WM_USER+0x64
; Author(s):        Florian 'Piccaso' Fida
; Note(s):			If the process doesent have a Window it will be created
;					The Reciver Function must accept 1 Parameter
;
;===============================================================================
Func _CoProcReciver($sFunction = Default)
	Local $sHandlerFuction = "__CoProcReciverHandler", $hWnd, $aTmp
	If IsKeyword($sFunction) Then $sFunction = ""
	$hWnd = _ProcessGetWinList(@AutoItPID, "", 16 + 2)
	If Not IsHWnd($hWnd) Then
		$hWnd = GUICreate("CoProcEventReciver")
		If @error Then Return SetError(1, 0, False)
	EndIf
	If $sFunction = "" Or IsKeyword($sFunction) Then $sHandlerFuction = ""
	If Not GUIRegisterMsg(0x4A, $sHandlerFuction) Then Return SetError(2, 0, False) ; WM_COPYDATA
	If Not GUIRegisterMsg(0x400 + 0x64, $sHandlerFuction) Then Return SetError(2, 0, False) ; WM_USER+0x64
	$gs_CoProcReciverFunction = $sFunction
	Return True
EndFunc   ;==>_CoProcReciver
Func __CoProcReciverHandler($hWnd, $iMsg, $WParam, $LParam)
	If $iMsg = 0x4A Then ; WM_COPYDATA
		Local $COPYDATA, $MyData
		$COPYDATA = DllStructCreate("ptr;dword;ptr", $LParam)
		$MyData = DllStructCreate("char[" & DllStructGetData($COPYDATA, 2) & "]", DllStructGetData($COPYDATA, 3))
		$gv_CoProcReviverParameter = DllStructGetData($MyData, 1)
		Return 256
	ElseIf $iMsg = 0x400 + 0x64 Then ; WM_USER+0x64
		If $gv_CoProcReviverParameter Then
			Call($gs_CoProcReciverFunction, $gv_CoProcReviverParameter)
			If @error And @Compiled = 0 Then MsgBox(16, "CoProc Error", "Unable to Call: " & $gs_CoProcReciverFunction)
			$gv_CoProcReviverParameter = 0
			Return 0
		EndIf
	EndIf
EndFunc   ;==>__CoProcReciverHandler

;===============================================================================
;
; Description:      Send a Message to a CoProcess
; Parameter(s):     $vProcess - Name or PID of Process
;					$vParameter - Parameter to pass
;					$iTimeout - Optional, Defaults to 500 (msec)
;					$fAbortIfHung - Optional, Default is True
; Requirement(s):   3.2.4.9
; Return Value(s):  On Success - Returns True
;                   On Failure - Returns False and Set
;												@error to:	1 - Process not found
;															2 - Window not found
;															3 - Timeout/Busy/Hung
;															4 - PostMessage Falied
; Author(s):        Florian 'Piccaso' Fida
; Note(s):
;
;==========================================================================
Func _CoProcSend($vProcess, $vParameter, $iTimeout = 500, $fAbortIfHung = True)
	Local $iPid, $hWndTarget, $MyData, $aTmp, $COPYDATA, $iFuFlags
	$iPid = ProcessExists($vProcess)
	If Not $iPid Then Return SetError(1, 0, False) ; Process not Found
	$hWndTarget = _ProcessGetWinList($vProcess, "", 16 + 2)
	If @error Or (Not $hWndTarget) Then Return SetError(2, 0, False) ; Window not found
	$MyData = DllStructCreate("char[" & StringLen($vParameter) + 1 & "]")
	$COPYDATA = DllStructCreate("ptr;dword;ptr")
	DllStructSetData($MyData, 1, $vParameter)
	DllStructSetData($COPYDATA, 1, 1)
	DllStructSetData($COPYDATA, 2, DllStructGetSize($MyData))
	DllStructSetData($COPYDATA, 3, DllStructGetPtr($MyData))
	If $fAbortIfHung Then
		$iFuFlags = 0x2 ; SMTO_ABORTIFHUNG
	Else
		$iFuFlags = 0x0 ; SMTO_NORMAL
	EndIf
	$aTmp = DllCall("user32.dll", "int", "SendMessageTimeout", "hwnd", $hWndTarget, "int", 0x4A _; WM_COPYDATA
			, "int", 0, "ptr", DllStructGetPtr($COPYDATA), "int", $iFuFlags, "int", $iTimeout, "long_ptr", 0)
	If @error Then Return SetError(3, 0, False) ; SendMessageTimeout Failed
	If Not $aTmp[0] Then Return SetError(3, 0, False) ; SendMessageTimeout Failed
	If $aTmp[7] <> 256 Then Return SetError(3, 0, False)
	$aTmp = DllCall("user32.dll", "int", "PostMessage", "hwnd", $hWndTarget, "int", 0x400 + 0x64, "int", 0, "int", 0)
	If @error Then Return SetError(4, 0, False)
	If Not $aTmp[0] Then Return SetError(4, 0, False)
	Return True
EndFunc   ;==>_CoProcSend

;===============================================================================
;
; Description:      Forwards StdOut and StdErr from specified Processes to Calling process
; Parameter(s):     $iPid1 - Pid of Procces
;					$iPidn - Optional, Up to 16 Processes
; Requirement(s):   3.1.1.131
; Return Value(s):  None
; Author(s):        Florian 'Piccaso' Fida
; Note(s):			Processes must provide StdErr and StdOut Streams (See Run())
;
;==========================================================================
Func _ConsoleForward($iPid1, $iPid2 = Default, $iPid3 = Default, $iPid4 = Default, $iPid5 = Default, $iPid6 = Default, $iPid7 = Default, $iPid8 = Default, $iPid9 = Default, $iPid10 = Default, $iPid11 = Default, $iPid12 = Default, $iPid13 = Default, $iPid14 = Default, $iPid15 = Default, $iPid16 = Default)
	Local $iPid, $i, $iPeek
	For $i = 1 To 16
		$iPid = Eval("iPid" & $i)
		If $iPid = Default Or Not $iPid Then ContinueLoop
		If ProcessExists($iPid) Then
			$iPeek = StdoutRead($iPeek, 0, True)
			If Not @error And $iPeek > 0 Then
				ConsoleWrite(StdoutRead($iPid))
			EndIf
			$iPeek = StderrRead($iPeek, 0, True)
			If Not @error And $iPeek > 0 Then
				ConsoleWriteError(StderrRead($iPid))
			EndIf
		EndIf
	Next
EndFunc   ;==>_ConsoleForward

;===============================================================================
;
; Description:      Removes as many pages as possible from the working set of the specified process.
; Parameter(s):     $vPid - Optional, Pid or Process Name
;					$hDll_psapi - Optional, Handle to psapi.dll
;					$hDll_kernel32 - Optional, Handle to kernel32.dll
; Requirement(s):   3.2.1.12
; Return Value(s):  On Success - nonzero
;                   On Failure - 0 and sets error to
;												@error to:	1 - Process Doesent exist
;															2 - OpenProcess Failed
;															3 - EmptyWorkingSet Failed
; Author(s):        Florian 'Piccaso' Fida
; Note(s):			$vPid can be the -1 Pseudo Handle
;
;===============================================================================
Func _ProcessEmptyWorkingSet($vPid = @AutoItPID, $hDll_psapi = "psapi.dll", $hDll_kernel32 = "kernel32.dll")
	Local $av_EWS, $av_OP, $iRval
	If $vPid = -1 Then ; Pseudo Handle
		$av_EWS = DllCall($hDll_psapi, "int", "EmptyWorkingSet", "ptr", -1)
	Else
		$vPid = ProcessExists($vPid)
		If Not $vPid Then Return SetError(1, 0, 0) ; Process Doesent exist
		$av_OP = DllCall($hDll_kernel32, "int", "OpenProcess", "dword", 0x1F0FFF, "int", 0, "dword", $vPid)
		If $av_OP[0] = 0 Then Return SetError(2, 0, 0) ; OpenProcess Failed
		$av_EWS = DllCall($hDll_psapi, "int", "EmptyWorkingSet", "ptr", $av_OP[0])
		DllCall($hDll_kernel32, "int", "CloseHandle", "int", $av_OP[0])
	EndIf
	If $av_EWS[0] Then
		Return $av_EWS[0]
	Else
		Return SetError(3, 0, 0) ; EmptyWorkingSet Failed
	EndIf
EndFunc   ;==>_ProcessEmptyWorkingSet


;===============================================================================
;
; Description:      Duplicates a Handle from or for another process
; Parameter(s):     $dwSourcePid - Pid from Source Process
;					$hSourceHandle - The Handle to duplicate
;					$dwTargetPid - Optional, Pid from Target Procces - Defaults to current process
;					$fCloseSource - Optional, Close the source handle - Defaults to False
; Requirement(s):   3.2.4.9
; Return Value(s):  On Success - Duplicated Handle
;                   On Failure - 0 and sets error to
;												@error to:	1 - Api OpenProcess Failed
;															2 - Api DuplicateHandle Falied
; Author(s):        Florian 'Piccaso' Fida
; Note(s):
;
;===============================================================================
Func _DuplicateHandle($dwSourcePid, $hSourceHandle, $dwTargetPid = @AutoItPID, $fCloseSource = False)
	Local $hTargetHandle, $hPrSource, $hPrTarget, $dwOptions
	$hPrSource = __dh_OpenProcess($dwSourcePid)
	$hPrTarget = __dh_OpenProcess($dwTargetPid)
	If $hPrSource = 0 Or $hPrTarget = 0 Then
		_CloseHandle($hPrSource)
		_CloseHandle($hPrTarget)
		Return SetError(1, 0, 0)
	EndIf
	; DUPLICATE_CLOSE_SOURCE = 0x00000001
	; DUPLICATE_SAME_ACCESS = 0x00000002
	If $fCloseSource <> False Then
		$dwOptions = 0x01 + 0x02
	Else
		$dwOptions = 0x02
	EndIf
	$hTargetHandle = DllCall("kernel32.dll", "int", "DuplicateHandle", "ptr", $hPrSource, "ptr", $hSourceHandle, "ptr", $hPrTarget, "long_ptr", 0, "dword", 0, "int", 1, "dword", $dwOptions)
	If @error Then Return SetError(2, 0, 0)
	If $hTargetHandle[0] = 0 Or $hTargetHandle[4] = 0 Then
		_CloseHandle($hPrSource)
		_CloseHandle($hPrTarget)
		Return SetError(2, 0, 0)
	EndIf
	Return $hTargetHandle[4]
EndFunc   ;==>_DuplicateHandle
Func __dh_OpenProcess($dwProcessId)
	; PROCESS_DUP_HANDLE = 0x40
	Local $hPr = DllCall("kernel32.dll", "ptr", "OpenProcess", "dword", 0x40, "int", 0, "dword", $dwProcessId)
	If @error Then Return SetError(1, 0, 0)
	Return $hPr[0]
EndFunc   ;==>__dh_OpenProcess
Func _CloseHandle($hAny)
	If $hAny = 0 Then Return SetError(1, 0, 0)
	Local $fch = DllCall("kernel32.dll", "int", "CloseHandle", "ptr", $hAny)
	If @error Then Return SetError(1, 0, 0)
	Return $fch[0]
EndFunc   ;==>_CloseHandle



#region Internal Functions
Func __CoProcStartup()
	Local $sCmd = EnvGet("CoProc")
	If StringLeft($sCmd, 2) = "0x" Then
		$sCmd = BinaryToString ($sCmd)
		$gi_CoProcParent = Number(EnvGet("CoProcParent"))
		If StringInStr($sCmd, "(") And StringInStr($sCmd, ")") Then
			Execute($sCmd)
			If @error And Not @Compiled Then MsgBox(16, "CoProc Error", "Unable to Execute: " & $sCmd)
			Exit
		EndIf
		If EnvGet("CoProcParameterPresent") = "True" Then
			Call($sCmd, BinaryToString (EnvGet("CoProcParameter")))
			If @error And Not @Compiled Then MsgBox(16, "CoProc Error", "Unable to Call: " & $sCmd & @LF & "Parameter: " & BinaryToString (EnvGet("CoProcParameter")))
		Else
			Call($sCmd)
			If @error And Not @Compiled Then MsgBox(16, "CoProc Error", "Unable to Call: " & $sCmd)
		EndIf
		Exit
	EndIf
EndFunc   ;==>__CoProcStartup
Func __CoProcDummy($vPar = Default)
	If Not IsKeyword($vPar) Then _CoProcReciver($vPar)
	While ProcessExists($gi_CoProcParent)
		Sleep(500)
	WEnd
EndFunc   ;==>__CoProcDummy
__CoProcStartup()
#endregion

版权声明:本站所有文章和资源使用CC BY-NC-SA 4.0协议授权发布 , 转载应当以相同方式注明文章来自“SeaOMC.COM->AutoIt3(au3)源码-时间校准工具源码!在下边可以分享本文哦!
喜欢 (0)
[]
分享 (0)
奇跡の海
关于作者:
一个WordPress菜鸟!
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址