Что нового

[Процессы] Не срабатывает событие Case $nDummy

freed21

Новичок
Сообщения
39
Репутация
1
Господа, пишу скрипт и возникла проблема на которую убил массу времени :stars:. Хочу поскорее с ней расправиться, поэтому прошу вас о помощи.
В моём скрипте не срабатывает событие $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 или в рабочую папку скрипта.
 

erlik

Продвинутый
Сообщения
317
Репутация
84
Могу предположить, что у вас RichEdit блокирует отправку сообщения элементу $nDummy.
GUICtrlSendToDummy в приведенном скрипте возвращает именно 0. То есть ошибку. Типа, извиняй, не могу послать :smile:. Как это разрулить - не знаю. С элементом RichEdit почти не работал.
 
Автор
F

freed21

Новичок
Сообщения
39
Репутация
1
В моем другом скрипте, где всё то же самое (и Dummy и RichEdit и эти псевдоссылки), все работает на ура. Собственно оттуда я и перенес эту идею. Но почему то именно в этом скрипте наотрез отказывается работать :mad:
Кстати, как ты узнал, что Dummy ноль возвращает? Я как ни пытался его оследить, у меня почему-то не вышло.
 

erlik

Продвинутый
Сообщения
317
Репутация
84
freed21
Код:
ConsoleWrite('GUICtrlSendToDummy:' & GUICtrlSendToDummy($nDummy,1) &'|'  & $nDummy & @CRLF)

Сама функция возвращает 0. А $nDummy все вроде в порядке - id ему назначается.
PS: 1 во второй аргумент добавил просто для теста.
--------------------------------------------
Ну раз RichEdit вне подозрений - ищи тогда другие отличия от своего другого рабочего скрипта.
 
Автор
F

freed21

Новичок
Сообщения
39
Репутация
1
Всё, перехватил этот ноль, теперь не знаю что с ним делать и откуда у него ноги растут :smile:


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

Помогите пожалуйста, работа встала из за этой фигни.. Если не можете сказать что не так, то хотя бы чем можно заменить Dummy. А то сижу, думаю, форум облазил весь, как справиться не знаю. :wall_brake: :wall_brake:
 
Верх