Что нового

_GetIP (прогрузка) + счётчик времени (выполнение функции каждые N секунд)

running-frag

why me?
Сообщения
441
Репутация
60
есть скрипт (не ругайте сильно)

Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <StaticConstants.au3>
#include <INet.au3>
#include <Timers.au3>


$hGUI = 	GUICreate			("My GUI", 400, 25, @DesktopWidth/2 - 200, 0, $WS_POPUP)
			
			GUICtrlCreateLabel 	("IP", 				1, 	0, 50, 24, BitOR ($SS_CENTER, $SS_CENTERIMAGE))
			;GUICtrlSetBkColor	(-1, 0x101010)
			;GUICtrlSetColor		(-1, 0xFFFFFF)
			GUICtrlSetFont		(-1, 14)
			
$hIP = 		GUICtrlCreateLabel 	("none", 	52, 0, 347, 24, BitOR ($SS_CENTER, $SS_CENTERIMAGE))
			;GUICtrlSetBkColor 	(-1, 0x101010)
			;GUICtrlSetColor		(-1, 0xFFFFFF)
			GUICtrlSetFont		(-1, 18)
			
$hIPtimer = GUICtrlCreateLabel 	("0",				375,0,	15,	10)
			
			;GUICtrlSetColor		(-1, 0xFFFFFF)
			GUICtrlSetFont		(-1, 8)
			
			
			GUISetState			(@SW_SHOW, $hGUI)

$_timer_s = _Timer_Init()
While 1
	
	
	If GUIGetMsg () = $GUI_EVENT_CLOSE Then
		ExitLoop
	Else
		ip_get_current ()
	EndIf
WEnd


Func ip_get_current ()
	$_ms = _Timer_Diff ($_timer_s)
	
	$_ip = _GetIP()
	;ToolTip (Round ($_ms/1000))
	
	GUICtrlSetData ($hIPtimer, Mod (Round ($_ms/1000), 3))
		
	If Mod (Round ($_ms/1000), 3) = 0 Then
		If Not (GUICtrlRead ($hIP) == $_ip) Then
			GUICtrlSetData ($hIP, $_ip)
		EndIf
	EndIf
	
	Sleep (500)
	
EndFunc


Интересует два момента.
1. Когда скрипт запущен то при запуске _GetIP мышь начинает "оповещать" что он над чем то думает (это легко увидеть запустив и наведя мышку на рабочий стол). Можно ли это "оповещение" как то убрать\скрыть (уж больно раздрожает)?

2. Правильно ли реализован таймаут "каждые три секунды"?

PS: Да и вообще, как бы вы реализовали этот код..
 

rusreg79

Продвинутый
Сообщения
159
Репутация
57
Как избавится от курсора ожидания не подскажу, сам код реализовал бы так если правильно понял его смысл
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <StaticConstants.au3>
#include <INet.au3>

$hGUI =     GUICreate           ("My GUI", 400, 25, @DesktopWidth/2 - 200, 0, $WS_POPUP)
            GUICtrlCreateLabel  ("IP",              1,  0, 50, 24, BitOR ($SS_CENTER, $SS_CENTERIMAGE))
            GUICtrlSetFont      (-1, 14)
$hIP =      GUICtrlCreateLabel  ("none",    52, 0, 347, 24, BitOR ($SS_CENTER, $SS_CENTERIMAGE))
            GUICtrlSetFont      (-1, 18)
$hIPtimer = GUICtrlCreateLabel  ("0",               375,0,  15, 10)
            GUICtrlSetFont      (-1, 8)
            GUISetState         (@SW_SHOW, $hGUI)

Global $_sek = 3
AdlibRegister('ip_get_current',1000)


While 1
	Sleep(100)
WEnd

Func ip_get_current ()

	If $_sek = 3  Then
		$_ip = _GetIP()
		If Not @error And (GUICtrlRead ($hIP) <> $_ip) Then
			GUICtrlSetData ($hIP, $_ip)
		EndIf
		$_sek = 0
	EndIf

	GUICtrlSetData($hIPtimer, $_sek)
	$_sek += 1
EndFunc
 

VladUs

Скриптер
Сообщения
621
Репутация
181
running-frag [?]
PS: Да и вообще, как бы вы реализовали этот код..

Код:
#include <Inet.au3>
#Include <Date.au3>
#include <EditConstants.au3>
#include <WindowsConstants.au3>
#include <GuiConstants.au3>



AdlibRegister("_getWan",10000)
	
$Gui = GUICreate("My Gui",410,50,@DesktopWidth - 410,0,$WS_POPUPWINDOW)
$guiedit = GUICtrlCreateLabel("",0,0,350,50,Default,$GUI_WS_EX_PARENTDRAG)
$guiLab_ = GUICtrlCreateLabel("    _",370,0,20,20,Default,$GUI_WS_EX_PARENTDRAG)
$guiLabX = GUICtrlCreateLabel("X",400,0,20,20,Default,$GUI_WS_EX_PARENTDRAG)



GUICtrlSetFont($guiedit,12)
GUISetBkColor(0xE3E3E3)
GUICtrlSetBkColor($guiedit,0xE3E3E3)
GUICtrlSetColor($guiLabX,0xBA3332)
GUISetState()

_getWan()
While  1
 $msg = GUIGetMsg ()
 Switch $msg
   Case $guiLabX
 Exit
Case $guiLab_
 GUISetState(@SW_MINIMIZE)
EndSwitch
WEnd


Func _getWan()	
$PublicIP = _GetIP()
GUICtrlSetData($guiedit,$PublicIP & "     " & _Now())
EndFunc
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
964
running-frag
Вы как я понял за router`ом? Если да, тогда проще брать внешний IP с router`а.
 
Автор
R

running-frag

why me?
Сообщения
441
Репутация
60
нет я сижу не за роутером (ну личного нет), использую свитчер для "переключения" ипов, посему и нужен этот скрипт (что б не запутаться)

ну варианты интересные спс, одно волнует - неужели никак нельзя решить вопрос с прогрузкой? (курсор ожидания)
 
Автор
R

running-frag

why me?
Сообщения
441
Репутация
60
я вот думаю, если нет решения, может проще тогда использывать @IPAddressN (там хоть "прогрузки" нет), но тут получается беда с определением (если б хотя бы можно было сделать проверку по "имени соединения" - можно ли как то это сделать?)
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,716
Просто поменяйте соответствующий вид курсора в настройках Windows, или так (до перезагрузки):

Код:
_WinAPI_SetSystemCursor(_WinAPI_LoadCursor(0, 32512), 32650, 1)


Также можно менять системный курсор до выполнения проверки IP и восстанавливать после.

_GetIP() очень брутальная функция, проще опросить какой-нибудь простой и надежный сервис напрямую, например:

Код:
ConsoleWrite(BinaryToString(InetRead('http://www.myip.ru/get_ip.php?loc=', 1)) & @CR)


Осталось только извлечь строку с IP. Но я с рег. выражениями не дружу...

:smile:



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

Вот так еще проще:

Код:
ConsoleWrite(StringRegExpReplace(BinaryToString(InetRead('http://checkip.dyndns.com', 1)), '.+?([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+).+\s', '\1') & @CR)
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,716
Код:
#Include <WinAPIEx.au3>

Func _GetIPEx($sUrl = 'http://checkip.dyndns.com')

	Local $IP, $hPrev = _WinAPI_CopyCursor(_WinAPI_LoadCursor(0, 32650))

	_WinAPI_SetSystemCursor(_WinAPI_LoadCursor(0, 32512), 32650, 1)
	$IP = StringRegExp(BinaryToString(InetRead($sUrl, 1)), '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+', 1)
	Sleep(200)
	_WinAPI_SetSystemCursor($hPrev, 32650)
	If IsArray($IP) Then
		Return $IP[0]
	Else
		Return ''
	EndIf
EndFunc   ;==>_GetIPEx

For $i = 1 To 5
	ConsoleWrite(_GetIPEx() & @CR)
	Sleep(1000)
Next
 
Автор
R

running-frag

why me?
Сообщения
441
Репутация
60
аааабалдеть спасибо! :smile:


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

в сумме имеем следующий код

Код:
#include <Inet.au3>
#Include <Date.au3>
#include <EditConstants.au3>
#include <WindowsConstants.au3>
#include <GuiConstants.au3>
#include <StaticConstants.au3>
#include <GUIConstantsEx.au3>
#include <WinAPIEx.au3>

Opt ("MustDeclareVars", 1)
Opt ("TrayMenuMode",	1)	; Default tray menu items (Script Paused/Exit) will not be shown.

					TraySetState		(1)
					TraySetIcon			("Shell32.dll",		-14)
				
					AdlibRegister		("update_ip", 3000)
				
Local $hAction
Local $hGUI = 		GUICreate			("Current IP", 		270, 	25, 	@DesktopWidth -275, 	0, 	$WS_POPUPWINDOW, 	$WS_EX_TOOLWINDOW)
					GUISetBkColor		(0x000000, $hGUI)


Local $hTime = 		GUICtrlCreateLabel	("time...",			5,		5,		50,						15, BitOR ($SS_CENTER, $SS_CENTERIMAGE))
					GUICtrlSetColor 	(-1, 				0xFFFFFF)
					
Local $hIP = 		GUICtrlCreateLabel	("loading...", 		60,		0, 		205, 					25, BitOR ($SS_CENTER, $SS_CENTERIMAGE),	$GUI_WS_EX_PARENTDRAG)
					GUICtrlSetColor		(-1,				0xFFFFFF)
					GUICtrlSetFont		(-1, 				16)
					
					
					
					
					
Local $hMenu = 		GUICtrlCreateContextMenu 	($hIP)
Local $hMenuHide = 	GUICtrlCreateMenuItem 		("hide window", $hMenu)
;Local $hMenuExit = 	GUICtrlCreateMenuItem 		("exit", $hMenu)

Local $hTrayHide = 	TrayCreateItem		("hide Window")
					TrayCreateItem		("")
Local $hTrayExit = 	TrayCreateItem		("exit")
					GUISetState 		(@SW_SHOW, 			$hGUI)

Func update_ip ()
	GUICtrlSetData	($hTime, 	_NowTime (5))
	
	Local $_new = _GetIPEx ()
	
	If GUICtrlRead ($hIP) <> $_new Then
		GUICtrlSetData 	($hIP, $_new)
		TraySetToolTip 	("current ip " &$_new)
	EndIf
	
EndFunc


Func _GetIPEx($sUrl = 'http://checkip.dyndns.com')
	Local $IP, $hPrev = _WinAPI_CopyCursor (_WinAPI_LoadCursor (0, 32650))

    _WinAPI_SetSystemCursor (_WinAPI_LoadCursor (0, 32512), 32650, 1)
	
    $IP = StringRegExp (BinaryToString (InetRead ($sUrl, 1)), '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+', 1)
	
    Sleep(200)
	
    _WinAPI_SetSystemCursor ($hPrev, 32650)
    
	If IsArray ($IP) Then
        Return $IP[0]
    Else
        Return ''
    EndIf
	
EndFunc

While 1
	$hAction = TrayGetMsg ()
	
	If Not ($hAction) Then
		$hAction = GUIGetMsg ()
	EndIf
	
	Select
		
		Case $hAction = $hTrayExit ;Or $hAction = $hMenuExit
			ExitLoop
		
		Case $hAction = $hTrayHide
			If BitAND (WinGetState ($hGUI), 2) == 2 Then
				GUISetState (@SW_HIDE, $hGUI)
			Else
				GUISetState (@SW_SHOW, $hGUI)
			EndIf
			
		Case $hAction = $hMenuHide
			GUISetState (@SW_HIDE, $hGUI)
			
	EndSelect
		
WEnd



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

сюда бы ещё прикрутить смену IP через CMD вообще золото было бы :scratch:

ps: речь идёт не о опциональной части (что меняем) а о самой реализации\комманде в cmd
 
Автор
R

running-frag

why me?
Сообщения
441
Репутация
60
нене я про
CMD
netsh interface ip set dnsservers name="lan" source=static address=195.121.111.111
netsh interface ip set address name="lan" source=static addr=192.168.1.23 mask=255.255.255.0 gateway=192.168.1.1 gwmetric=1



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

тоже разобрался, курить через ShellExecuteWait () нужно :smile: :whistle:
 
Автор
R

running-frag

why me?
Сообщения
441
Репутация
60
беда, при такой схеме, во время попытки смены на второй ("secondary") вылетаем без ошибки в консоле :(

Код:
#include <Inet.au3>
#Include <Date.au3>
#include <EditConstants.au3>
#include <WindowsConstants.au3>
#include <GuiConstants.au3>
#include <StaticConstants.au3>
#include <GUIConstantsEx.au3>
#include <WinAPIEx.au3>

Opt ("MustDeclareVars", 1)
Opt ("TrayMenuMode",	1)	; Default tray menu items (Script Paused/Exit) will not be shown.

					TraySetState		(1)
					TraySetIcon			("Shell32.dll",		-14)
				
					AdlibRegister		("update_ip", 1000)
				
Local $hAction
Local $hGUI = 		GUICreate			("Current IP", 		270, 	25, 	@DesktopWidth -275, 	0, 	$WS_POPUPWINDOW, 	$WS_EX_TOOLWINDOW)
					GUISetBkColor		(0x000000, $hGUI)


Local $hTime = 		GUICtrlCreateLabel	("time...",			5,		5,		50,						15, BitOR ($SS_CENTER, $SS_CENTERIMAGE))
					GUICtrlSetColor 	(-1, 				0xFFFFFF)
					
Local $hIP = 		GUICtrlCreateLabel	("loading...", 		60,		0, 		205, 					25, BitOR ($SS_CENTER, $SS_CENTERIMAGE),	$GUI_WS_EX_PARENTDRAG)
					GUICtrlSetColor		(-1,				0xFFFFFF)
					GUICtrlSetFont		(-1, 				16)
					
					
					
					
					
Local $hMenu = 			GUICtrlCreateContextMenu 	($hIP)
Local $hMenuHide = 		GUICtrlCreateMenuItem 		("hide window", $hMenu)

Local $hMenuChange = 	GUICtrlCreateMenu 			("set to", 		$hMenu)
Local $hMenuChange1 = 	GUICtrlCreateMenuItem		("first",		$hMenuChange)
Local $hMenuChange2 = 	GUICtrlCreateMenuItem		("second",		$hMenuChange) 
Local $hMenuChange3 =  	GUICtrlCreateMenuItem		("third",		$hMenuChange)

Local $hTrayHide = 	TrayCreateItem		("hide Window")
					TrayCreateItem		("")
Local $hTrayExit = 	TrayCreateItem		("exit")
					GUISetState 		(@SW_SHOW, 			$hGUI)

Func update_ip ()
	GUICtrlSetData	($hTime, 	_NowTime (5))
	
	Local $_new = _GetIPEx ()
	
	If GUICtrlRead ($hIP) <> $_new Then
		GUICtrlSetData 	($hIP, $_new)
		TraySetToolTip 	("current ip " &$_new)
	EndIf
	
EndFunc


Func _GetIPEx($sUrl = 'http://checkip.dyndns.com')
	Local $IP, $hPrev = _WinAPI_CopyCursor (_WinAPI_LoadCursor (0, 32650))

    _WinAPI_SetSystemCursor (_WinAPI_LoadCursor (0, 32512), 32650, 1)
	
    $IP = StringRegExp (BinaryToString (InetRead ($sUrl, 1)), '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+', 1)
	
    Sleep(200)
	
    _WinAPI_SetSystemCursor ($hPrev, 32650)
    
	If IsArray ($IP) Then
        Return $IP[0]
    Else
        Return '0.0.0.0'
    EndIf
	
EndFunc



Func _change ($_type)
	Local $_string = ""
	
	Select
		Case $_type == "first"
			$_string = "interface ip set address name=XXXXXXXX source=static addr=XX.XX.XX.XX mask=255.255.255.0 gateway=XX.XX.XX.XX gwmetric=1"
		
		Case $_type == "second"
			$_string = "interface ip set address name=XXXXXXXX source=static addr=XX.XX.XX.XX mask=255.255.255.0 gateway=XX.XX.XX.XX gwmetric=1"
			
		Case $_type == "third"	
			$_string = ""
			
		;Case $_type == "dns"
		;		$_string = "interface ip set dnsservers name=XXXXXXXX source=static address=XX.XX.XX.XX"
				
	EndSelect
			
	ShellExecuteWait 	(@SystemDir & "\netsh.exe", $_string)
EndFunc

While 1
	$hAction = TrayGetMsg ()
	
	If Not ($hAction) Then
		$hAction = GUIGetMsg ()
	EndIf
	
	Select
		
		Case $hAction = $hTrayExit ;Or $hAction = $hMenuExit
			ExitLoop
		
		Case $hAction = $hTrayHide
			If BitAND (WinGetState ($hGUI), 2) == 2 Then
				GUISetState (@SW_HIDE, $hGUI)
			Else
				GUISetState (@SW_SHOW, $hGUI)
			EndIf
			
		Case $hAction = $hMenuHide
			GUISetState (@SW_HIDE, $hGUI)
		
		Case $hAction = $hMenuChange1
			_change ("first")
		Case $hAction = $hMenuChange2
			_change ("second")
		Case $hAction = $hMenuChange3
			_change ("third")


	EndSelect
		
WEnd


где ошибка? :(
 
Верх