Господа, пишу скрипт и возникла проблема на которую убил массу времени :stars:. Хочу поскорее с ней расправиться, поэтому прошу вас о помощи.
В моём скрипте не срабатывает событие $nDummy в главном цикле, хотя аналогичная функция есть в другом моем скрипте и отлично работает.. Что не так?
Суть такова, что когда скрипт отработает после нажатия "искать", в конце появится псевдоссылка, по нажатию на которую выполнится определенное действие, но оно не выполняется :(
PS: для того чтобы выполнялась сторонняя команда Whosip нужно файлик http://www.nirsoft.net/utils/whosip.zip закинуть в папку system32 или в рабочую папку скрипта.
В моём скрипте не срабатывает событие $nDummy в главном цикле, хотя аналогичная функция есть в другом моем скрипте и отлично работает.. Что не так?
Код:
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <GuiIPAddress.au3>
#include <ProgressConstants.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <GuiRichEdit.au3>
#Include <Encoding.au3>
#Region ### START Koda GUI section ### Form=
$MainForm = GUICreate("Word in WhoIs", 395, 340, 340, 147)
$Group1 = GUICtrlCreateGroup("", 8, 8, 377, 321)
$Label1 = GUICtrlCreateLabel("Введите границы диапазона IP-адресов", 16, 24, 206, 17)
$IPMin = _GUICtrlIpAddress_Create($MainForm, 16, 48, 154, 21)
_GUICtrlIpAddress_Set($IPMin, "8.8.8.8")
$IPMax = _GUICtrlIpAddress_Create($MainForm, 224, 48, 154, 21)
_GUICtrlIpAddress_Set($IPMax, "8.8.8.13")
$Label2 = GUICtrlCreateLabel("<->", 191, 48, 19, 17)
$Label3 = GUICtrlCreateLabel("Введите слово, которое будем искать", 16, 80, 198, 17)
$InputWord = GUICtrlCreateInput("google", 16, 104, 281, 21)
$ButtonFind = GUICtrlCreateButton("Искать!", 304, 104, 75, 25, $WS_GROUP)
$ProgressFind = GUICtrlCreateProgress(18, 168, 358, 17)
$Label4 = GUICtrlCreateLabel("Информация о поиске", 136, 136, 118, 17)
$InfoFind = _GUICtrlRichEdit_Create($MainForm ,"", 16, 200, 361, 113, BitOR($ES_MULTILINE, $WS_VSCROLL, $ES_AUTOVSCROLL,$ES_READONLY))
GUICtrlCreateGroup("", -99, -99, 1, 1)
GUISetState(@SW_SHOW)
$WhoIsWindow = GUICreate("WhoIs Info", 440, 539, 630, 135)
$WhoIsGroup = GUICtrlCreateGroup("Who Is Information", 8, 8, 425, 522, BitOR($BS_CENTER,$BS_FLAT), $WS_EX_STATICEDGE)
$WhoIsInfo = GUICtrlCreateEdit("", 15, 23, 410, 500, BitOR($ES_MULTILINE, $WS_VSCROLL, $ES_AUTOVSCROLL,$ES_READONLY))
#EndRegion ### END Koda GUI section ###
Global $gWord, $dif, $ipMass, $ipMassRes, $iColor = 0xFFFFFF, $command = "whosip -r "
Global $nDummy = GUICtrlCreateDummy()
GUIRegisterMsg($WM_SETCURSOR, "_WM_SETCURSOR")
While 1
$nMsg = GUIGetMsg(1)
Switch $nMsg[1]
Case $MainForm
Switch $nMsg[0]
Case $GUI_EVENT_CLOSE
_GUICtrlRichEdit_Destroy($InfoFind)
Exit
Case $ButtonFind
$hWord = GUICtrlRead($InputWord)
$ipMass=int2mass()
_read_cmd()
Case $nDummy
Switch _GUICtrlRichEdit_GetCharColor($InfoFind)
Case $iColor
GUISetState(@SW_HIDE, $WhoIsWindow)
MsgBox(0,0,'111')
_who_is_child()
EndSwitch
EndSwitch
Case $WhoIsWindow
Switch $nMsg[0]
Case $GUI_EVENT_CLOSE
GUISetState(@SW_HIDE, $WhoIsWindow)
EndSwitch
EndSwitch
WEnd
Func int2mass()
_GUICtrlRichEdit_AppendText($InfoFind, 'Создание списка ip адресов...'&@CR)
$start = _GUICtrlIpAddress_Get($IPMin)
$end = _GUICtrlIpAddress_Get($IPMax)
$long_start=ip2int($start)
$long_end=ip2int($end)
$dif=$long_end-$long_start
Dim $ipMass[$dif+1]
$percent = 100/$dif
For $i = 0 To $dif
$ipMass[$i]=int2ip($long_start+$i)
GUICtrlSetData($ProgressFind, $percent*$i)
Next
_GUICtrlRichEdit_SetCharAttributes($InfoFind, "+bo")
_GUICtrlRichEdit_AppendText($InfoFind, 'Список из '&$dif&' адресов создан!'&@CR)
return $ipMass
EndFunc
Func ip2int($realIp)
Local $ipoct = StringSplit($realIp,'.',2)
Local $oct1 = $ipoct[0]
Local $oct2 = $ipoct[1]
Local $oct3 = $ipoct[2]
Local $oct4 = $ipoct[3]
Return $oct1*16777216+$oct2*65536+$oct3*256+$oct4
EndFunc
Func int2ip($intIp)
Local $oct1n = Int($intIp/16777216)
Local $oct2n = Int(($intIp-$oct1n*16777216)/65536)
Local $oct3n = Int(($intIp-$oct1n*16777216-$oct2n*65536)/256)
Local $oct4n = Int($intIp-$oct1n*16777216-$oct2n*65536-$oct3n*256)
Return $oct1n & '.' & $oct2n & '.' & $oct3n & '.' & $oct4n
EndFunc
Func _read_cmd()
$percent = 100/$dif
Dim $ipMassRes[1]
GUICtrlSetData($ProgressFind, 0)
_GUICtrlRichEdit_AppendText($InfoFind, 'Поиск слова '&$hWord&' в информации об ip адресах...'&@CR)
$sBuffer = ''
GUICtrlSetData($ButtonFind, 'Остановить')
For $i = 0 To $dif
Redim $ipMassRes[$i+1]
_API_LockSetForegroundWindow(1)
$iPID = Run(StringReplace($command&$ipMass[$i], '"', '""'), @ScriptDir, $GUI_HIDE, 2)
If Not $iPID Then Exit -33
While 1
$sBuffer = StdoutRead($iPID)
If @error Then
ExitLoop
EndIf
If $sBuffer Then
_GUICtrlRichEdit_AppendText($InfoFind, $ipMass[$i])
if StringRegExp($sBuffer, '\W'&$hWord&'\W') then
_GUICtrlRichEdit_SetCharAttributes($InfoFind, "+bo")
_GUICtrlRichEdit_AppendText($InfoFind,' -- Найдено'&@CR)
$ipMassRes[$i] = $ipMass[$i]
else
_GUICtrlRichEdit_AppendText($InfoFind,' -- Не найдено'&@CR)
Endif
GUICtrlSetData($ProgressFind, $percent*$i)
EndIf
WEnd
ProcessClose($iPid)
_API_LockSetForegroundWindow(2)
Next
GUICtrlSetData($ButtonFind, 'Искать')
_results()
return $ipMassRes
EndFunc
Func _results()
_GUICtrlRichEdit_SetCharAttributes($InfoFind, "+bo")
_GUICtrlRichEdit_AppendText($InfoFind,'Найдено '& Ubound($ipMassRes)& ' ip адресов c заданным словом'&@CR)
$i_Pos = _GUICtrlRichEdit_GetFirstCharPosOnLine($InfoFind)
_GUICtrlRichEdit_AppendText($InfoFind,'Посмотреть результат >> '&@CR)
_RichEdit_Set_Like_Link($InfoFind, $i_Pos+1, $iColor)
_GUICtrlRichEdit_Deselect($InfoFind)
EndFunc
Func _API_LockSetForegroundWindow($nLockCode)
;~ 1 Lock Foreground Window Focus, 2 Unlock Foreground Window Focus
Local $aRet = DllCall("user32.dll", "bool", "LockSetForegroundWindow", "uint", $nLockCode)
If @error Or $aRet[0] Then Return SetError(1, 0, 0)
Return $aRet[0]
EndFunc ;==>__IELockSetForegroundWindow
Func _RichEdit_Set_Like_Link($InfoFind, $i_Pos, $i_Color)
Local $i_Start, $i_End
$i_Start = _GUICtrlRichEdit_GetCharPosOfPreviousWord($InfoFind, $i_Pos)
$i_End = _GUICtrlRichEdit_GetCharPosOfNextWord($InfoFind, $i_Pos+20)
_GUICtrlRichEdit_SetSel($InfoFind, $i_Start, $i_End)
_GUICtrlRichEdit_SetCharColor($InfoFind, $i_Color)
_GUICtrlRichEdit_SetCharAttributes($InfoFind, '+li')
EndFunc
Func _WM_SETCURSOR($hWnd, $Msg, $wParam, $lParam)
Switch $wParam
Case $InfoFind
Switch BitShift($lParam, 16)
Case $WM_LBUTTONDOWN
GUICtrlSendToDummy($nDummy)
EndSwitch
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc ;==>_WM_SETCURSOR
Func _who_is_child()
For $i = 0 To Ubound($ipMassRes)
_API_LockSetForegroundWindow(1)
;_GUICtrlRichEdit_AppendText( ,'***Информация о IP-адресе '&$ipMassRes[$i]&'***'&@CR&@CR)
GUICtrlSetData($WhoIsInfo,'***Информация о IP-адресе '&$ipMassRes[$i]&'***'&@CR&@CR )
$iPID = Run(StringReplace($command&$ipMass[$i], '"', '""'), @ScriptDir, $GUI_HIDE, 2)
If Not $iPID Then Exit -33
While 1
$sBuffer = StdoutRead($iPID)
If @error Then
ExitLoop
EndIf
If $sBuffer Then
_GUICtrlRichEdit_AppendText($WhoIsInfo, $sBuffer)
Endif
WEnd
ProcessClose($iPid)
_API_LockSetForegroundWindow(2)
Next
GUISetState(@SW_SHOW,$WhoIsWindow)
;$retWhoIS = _WinAPI_OemToChar($retWhoIS)
;$retWhoIS = StringStripCR($retWhoIS)
;$retWhoIS = StringRegExpReplace($retWhoIS, '((^[\n]*)|([\n]*$))', '')
;$retWhoIS = StringRegExpReplace($retWhoIS, '[\n]{2,}', @LF)
;$aRead = StringSplit($retWhoIS, @LF)
;$Lines_r = _ArrayToString($aRead, @CRLF, 1)
;GUICtrlSetData ($WhoIsInfo,$Label)
;GUICtrlSetData($WhoIsInfo,$Lines_r)
EndFunc
Суть такова, что когда скрипт отработает после нажатия "искать", в конце появится псевдоссылка, по нажатию на которую выполнится определенное действие, но оно не выполняется :(
PS: для того чтобы выполнялась сторонняя команда Whosip нужно файлик http://www.nirsoft.net/utils/whosip.zip закинуть в папку system32 или в рабочую папку скрипта.