Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [решено] GUIOnEventMode vs дочерняя форма vs Combo (обработка цикла) (http://forum.oszone.net/showthread.php?t=183643)

saavaage 23-08-2010 15:11 1480011

GUIOnEventMode vs дочерняя форма vs Combo (обработка цикла)
 
Есть форма с вкладкой, на которой выводится инфо о текущих адаптерах системы и статистика сессии по ним. Встала проблема с совмещением режима EventMode и собственно, обработкой событий Combo. Ситуация осложнена наличием дочернего окна с настройками утилиты (планируется):
читать дальше »
Код:

#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <TabConstants.au3>
#include <WindowsConstants.au3>
#Include <ComboConstants.au3>
#Include <GUIComboBox.au3>
#Include <GUIConstantsEx.au3>
#Include <StaticConstants.au3>

Global Const $MIB_IF_TYPE_OTHER = 1
Global Const $MIB_IF_TYPE_ETHERNET_CSMACD = 6
Global Const $MIB_IF_TYPE_ISO88025_TOKENRING = 9
Global Const $MIB_IF_TYPE_PPP = 23
Global Const $MIB_IF_TYPE_SOFTWARE_LOOPBACK = 24
Global Const $MIB_IF_TYPE_ATM = 37
Global Const $MIB_IF_TYPE_IEEE80211 = 71
Global Const $MIB_IF_TYPE_TUNNEL = 131
Global Const $MIB_IF_TYPE_IEEE1394 = 144

Global Const $MIB_IF_ADMIN_STATUS_UP = 1
Global Const $MIB_IF_ADMIN_STATUS_DOWN = 2
Global Const $MIB_IF_ADMIN_STATUS_TESTING = 3

Global Const $MIB_IF_OPER_STATUS_NON_OPERATIONAL = 0
Global Const $MIB_IF_OPER_STATUS_UNREACHABLE = 1
Global Const $MIB_IF_OPER_STATUS_DISCONNECTED = 2
Global Const $MIB_IF_OPER_STATUS_CONNECTING = 3
Global Const $MIB_IF_OPER_STATUS_CONNECTED = 4
Global Const $MIB_IF_OPER_STATUS_OPERATIONAL = 5

Global Const $tagMIB_IFROW = 'wchar Name[256];dword Index;dword Type;dword Mtu;dword Speed;dword PhysAddrLen;byte PhysAddr[8];dword AdminStatus;dword OperStatus;dword LastChange;dword InOctets;dword InUcastPkts;dword InNUcastPkts;dword InDiscards;dword InErrors;dword InUnknownProtos;dword OutOctets;dword OutUcastPkts;dword OutNUcastPkts;dword OutDiscards;dword OutErrors;dword OutQLen;dword DescrLen;char Descr[256]'

Global $Dll, $Combo, $Label41, $Label42, $Timer, $Data, $Index = 0, $pIndex = 0, $Adapter[1][3] = [[0]]


Opt("GUIOnEventMode", 1)

$hMain_GUI = GUICreate("Диагностика и Настройка", 619, 442, 189, 122)
GUISetIcon('setupapi.dll', 1)
GUISetFont(8.5, 400, 0, 'MS Shell Dlg')
GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSEClicked")

$Tab1 = GUICtrlCreateTab(8, 16, 601, 377)

;;;; Network ;;;;
$Network = GUICtrlCreateTabItem("Network")

;; интернет  - адаптеры
$Dll = DllOpen('IPHlpApi.dll')

$Data = _WinAPI_GetIfTable($MIB_IF_TYPE_ETHERNET_CSMACD, $Dll)
If Not @error Then
    For $i = 1 To $Data[0][0]
        $Adapter[0][0] += 1
        ReDim $Adapter[$Adapter[0][0] + 1][3]
        $Adapter[$Adapter[0][0]][0] = $Data[$i][1 ] ; Interface index
        $Adapter[$Adapter[0][0]][2] = $Data[$i][19] ; Description
    Next
EndIf

GUICtrlCreateGroup("Интернет-Адаптеры", 16, 288, 585, 97)
GUICtrlCreateLabel("Адаптер:", 32, 309, 49, 17)
$Combo = GUICtrlCreateCombo("", 88, 307,505, 25,  $CBS_DROPDOWNLIST)

If $Adapter[0][0] Then
    For $i = 1 To $Adapter[0][0]
        _GUICtrlComboBox_AddString($Combo, $Adapter[$i][2])
    Next
    $Index = 1
Else
    _GUICtrlComboBox_AddString($Combo, 'None')
    GUICtrlSetState(-1, $GUI_DISABLE)
EndIf
_GUICtrlComboBox_SetCurSel($Combo, 0)
GUICtrlCreateGroup("Трансфер (Bytes + MB):", 24, 333, 569, 44)
GUICtrlCreateLabel("Отдача:", 34, 354, 43, 17)
$Label41 = GUICtrlCreateInput("", 87, 353, 81, 17, $SS_RIGHT)
GUICtrlCreateInput("", 184, 353, 81, 17, $SS_RIGHT)
GUICtrlCreateLabel("Прием:", 346, 354, 43, 17)
$Label42 = GUICtrlCreateInput("", 399, 353, 81, 17, $SS_RIGHT)
GUICtrlCreateInput("", 496, 353, 81, 17, $SS_RIGHT)
_Combo()

DllClose($Dll)

GUICtrlCreateTabItem("")

;;;; Common Buttons ;;;;
$nSettings_Button = GUICtrlCreateButton("Опции", 500, 7, 105, 25)
$nExit_Button = GUICtrlCreateButton("Выход", 535, 400, 70, 33)
GUICtrlSetOnEvent($nExit_Button, "_MainGUI_Events")
GUICtrlSetOnEvent($nSettings_Button, "_MainGUI_Events")
GUISetOnEvent($GUI_EVENT_CLOSE, "_MainGUI_Events", $hMain_GUI)

GUISetState()

While 1
    Sleep(100)
WEnd


Func CLOSEClicked()
  Exit
EndFunc

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;      FUNCTIONS            ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Func _MainGUI_Events()
        Switch @GUI_CtrlId
        Case $GUI_EVENT_CLOSE, $nExit_Button
            Exit
        Case $nSettings_Button
            _Settings_GUI($hMain_GUI)
        EndSwitch
EndFunc

Func _Settings_GUI($hParent)
    Local $iOpt_GOEM, $hSettings_GUI, $nStngs_Close_Button, $nStngs_Save_Button

    $iOpt_GOEM = Opt("GUIOnEventMode", 0)

    $hSettings_GUI = GUICreate("Настройки", 400, 250, -1, -1, -1, -1, $hParent)
    $nStngs_Close_Button = GUICtrlCreateButton("Выход", 20, 220, 60, 20)
    $nStngs_Save_Button = GUICtrlCreateButton("Сохранить", 90, 220, 60, 20)

    GUISetState(@SW_DISABLE, $hParent)
    GUISetState(@SW_SHOW, $hSettings_GUI)

    While 1
          Switch GUIGetMsg()
            Case $GUI_EVENT_CLOSE, $nStngs_Close_Button
                ExitLoop
            Case $nStngs_Save_Button
                MsgBox(64, 'Сохранение настроек', 'Изменения сохранены!', 0, $hSettings_GUI)
                        EndSwitch
    WEnd

    GUISetState(@SW_ENABLE, $hParent)
    GUISetState(@SW_HIDE, $hSettings_GUI)

    Opt("GUIOnEventMode", $iOpt_GOEM)
EndFunc

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;          SECTIONS      ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


;; Network Section ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;; определение текущего АДАПТЕРА и его sent/receive
Func _Combo()
        While 1
    If ($Index) And (($Index <> $pIndex) Or (TimerDiff($Timer) > 1000)) Then
        $Data = _WinAPI_GetIfEntry($Adapter[$Index][0], $Dll)
        If Not @error Then
            GUICtrlSetData($Label41, _Str($Data[14]) & ' bytes')
            GUICtrlSetData($Label42, _Str($Data[8 ]) & ' bytes')
            GUICtrlSetData($Label41 + 1, StringFormat('%.2f', $Data[14] / 1024 / 1024) & ' MB')
            GUICtrlSetData($Label42 + 1, StringFormat('%.2f', $Data[8 ] / 1024 / 1024) & ' MB')
        Else
            GUICtrlSetData($Label41, '')
            GUICtrlSetData($Label42, '')
        EndIf
        $Timer = TimerInit()
        $pIndex = $Index
    EndIf
        $Index = _GUICtrlComboBox_GetCurSel($Combo) + 1
        WEnd
EndFunc


Func _Str($iValue)

    Local $Result = '', $Str = String($iValue)

    While StringLen($Str)
        $Result = '.' & StringRight($Str, 3) & $Result
        $Str = StringTrimRight($Str, 3)
    WEnd
    Return StringTrimLeft($Result, 1)
EndFunc  ;==>_Str

Func _WinAPI_GetIfEntry($iIndex, $Dll = -1)

    Local $Ret, $Data, $Addr, $Count
    Local $tMIB_IFROW

    If $Dll < 0 Then
        $Dll = 'IPHlpApi.dll'
    EndIf

    $tMIB_IFROW = DllStructCreate($tagMIB_IFROW)
    DllStructSetData($tMIB_IFROW, 2, $iIndex)
    $Ret = DLLCall($Dll, 'dword', 'GetIfEntry', 'ptr', DllStructGetPtr($tMIB_IFROW))
    If (@error) Or ($Ret[0]) Then
        Return SetError($Ret[0], 0, 0)
    EndIf
    Dim $Data[20]
    $Data[0 ] = DllStructGetData($tMIB_IFROW, 'Name')
    $Data[1 ] = $iIndex
    $Data[2 ] = DllStructGetData($tMIB_IFROW, 'Type')
    $Data[3 ] = DllStructGetData($tMIB_IFROW, 'Mtu')
    $Data[4 ] = DllStructGetData($tMIB_IFROW, 'Speed')
    $Count = DllStructGetData($tMIB_IFROW, 'PhysAddrLen')
    $Addr = ''
    For $i = 1 To $Count
        $Addr &= Hex(DllStructGetData($tMIB_IFROW, 'PhysAddr', $i), 2) & '-'
    Next
    $Data[5 ] = StringTrimRight($Addr, 1)
    $Data[6 ] = DllStructGetData($tMIB_IFROW, 'AdminStatus')
    $Data[7 ] = DllStructGetData($tMIB_IFROW, 'OperStatus')
    $Data[8 ] = DllStructGetData($tMIB_IFROW, 'InOctets')
    $Data[9 ] = DllStructGetData($tMIB_IFROW, 'InUcastPkts')
    $Data[10] = DllStructGetData($tMIB_IFROW, 'InNUcastPkts')
    $Data[11] = DllStructGetData($tMIB_IFROW, 'InDiscards')
    $Data[12] = DllStructGetData($tMIB_IFROW, 'InErrors')
    $Data[13] = DllStructGetData($tMIB_IFROW, 'InUnknownProtos')
    $Data[14] = DllStructGetData($tMIB_IFROW, 'OutOctets')
    $Data[15] = DllStructGetData($tMIB_IFROW, 'OutUcastPkts')
    $Data[16] = DllStructGetData($tMIB_IFROW, 'OutNUcastPkts')
    $Data[17] = DllStructGetData($tMIB_IFROW, 'OutDiscards')
    $Data[18] = DllStructGetData($tMIB_IFROW, 'OutErrors')
    $Data[19] = StringLeft(DllStructGetData($tMIB_IFROW, 'Descr'), DllStructGetData($tMIB_IFROW, 'DescrLen') - 1)
    Return $Data
EndFunc  ;==>_WinAPI_GetIfEntry

Func _WinAPI_GetIfTable($iType = 0, $Dll = -1)

    Local $Ret, $Row, $Type, $Tag, $Tab, $Addr, $Count, $Lenght
    Local $tMIB_IFTABLE, $tMIB_IFROW

    If $Dll < 0 Then
        $Dll = 'IPHlpApi.dll'
    EndIf

    $tMIB_IFROW = DllStructCreate($tagMIB_IFROW)
    $Row = 'byte[' & DllStructGetSize($tMIB_IFROW) & ']'
    $Tag = 'dword;'
    For $i = 1 To 32
        $Tag &= $Row & ';'
    Next
    $tMIB_IFTABLE = DllStructCreate($Tag)
    $Ret = DLLCall($Dll, 'dword', 'GetIfTable', 'ptr', DllStructGetPtr($tMIB_IFTABLE), 'long*', DllStructGetSize($tMIB_IFTABLE), 'int', 1)
    If (@error) Or ($Ret[0]) Then
        Return SetError($Ret[0], 0, 0)
    EndIf
    $Count = DllStructGetData($tMIB_IFTABLE, 1)
    Dim $Tab[$Count + 1][20]
    $Tab[0][0] = 0
    For $i = 1 To $Count
        $tMIB_IFROW = DllStructCreate($tagMIB_IFROW, DllStructGetPtr($tMIB_IFTABLE, $i + 1))
        $Type = DllStructGetData($tMIB_IFROW, 'Type')
        If ($iType = 0) Or ($iType = $Type) Then
            $Tab[0][0] += 1
            $Tab[$Tab[0][0]][0 ] = DllStructGetData($tMIB_IFROW, 'Name')
            $Tab[$Tab[0][0]][1 ] = DllStructGetData($tMIB_IFROW, 'Index')
            $Tab[$Tab[0][0]][2 ] = $Type
            $Tab[$Tab[0][0]][3 ] = DllStructGetData($tMIB_IFROW, 'Mtu')
            $Tab[$Tab[0][0]][4 ] = DllStructGetData($tMIB_IFROW, 'Speed')
            $Lenght = DllStructGetData($tMIB_IFROW, 'PhysAddrLen')
            $Addr = ''
            For $j = 1 To $Lenght
                $Addr &= Hex(DllStructGetData($tMIB_IFROW, 'PhysAddr', $j), 2) & '-'
            Next
            $Tab[$Tab[0][0]][5 ] = StringTrimRight($Addr, 1)
            $Tab[$Tab[0][0]][6 ] = DllStructGetData($tMIB_IFROW, 'AdminStatus')
            $Tab[$Tab[0][0]][7 ] = DllStructGetData($tMIB_IFROW, 'OperStatus')
            $Tab[$Tab[0][0]][8 ] = DllStructGetData($tMIB_IFROW, 'InOctets')
            $Tab[$Tab[0][0]][9 ] = DllStructGetData($tMIB_IFROW, 'InUcastPkts')
            $Tab[$Tab[0][0]][10] = DllStructGetData($tMIB_IFROW, 'InNUcastPkts')
            $Tab[$Tab[0][0]][11] = DllStructGetData($tMIB_IFROW, 'InDiscards')
            $Tab[$Tab[0][0]][12] = DllStructGetData($tMIB_IFROW, 'InErrors')
            $Tab[$Tab[0][0]][13] = DllStructGetData($tMIB_IFROW, 'InUnknownProtos')
            $Tab[$Tab[0][0]][14] = DllStructGetData($tMIB_IFROW, 'OutOctets')
            $Tab[$Tab[0][0]][15] = DllStructGetData($tMIB_IFROW, 'OutUcastPkts')
            $Tab[$Tab[0][0]][16] = DllStructGetData($tMIB_IFROW, 'OutNUcastPkts')
            $Tab[$Tab[0][0]][17] = DllStructGetData($tMIB_IFROW, 'OutDiscards')
            $Tab[$Tab[0][0]][18] = DllStructGetData($tMIB_IFROW, 'OutErrors')
            $Tab[$Tab[0][0]][19] = StringLeft(DllStructGetData($tMIB_IFROW, 'Descr'), DllStructGetData($tMIB_IFROW, 'DescrLen') - 1)
        EndIf
    Next
    If $Tab[0][0] < $Count Then
        ReDim $Tab[$Tab[0][0] + 1][20]
    EndIf
    Return $Tab
EndFunc  ;==>_WinAPI_GetIfTable

;; конец определение текущего адаптера и его sent/receive

;; End Network  Section  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;



Проблема - как только подключаю цикл в функции _Combo() (While 1 .... Wend), перестает отображаться окно формы на экране

FlatX007 23-08-2010 19:27 1480234

Пример не рабочий ... нет кучи инклюдов, мне нужно найти их самостоятельно тратить время?

В функции _Combo() присутствует без конечный цикл While 1
Функция DllClose($Dll) не на месте

Не знаю особо не проверял, не вникал в не рабочий пример! :-*

Код:

AdlibRegister('_Combo')

;~ ....
;~ ....
;~ ....


Func _Combo()
    If ($Index) And (($Index <> $pIndex) Or (TimerDiff($Timer) > 1000)) Then
        $Data = _WinAPI_GetIfEntry($Adapter[$Index][0], $Dll)
        If Not @error Then
            GUICtrlSetData($Label41, _Str($Data[14]) & ' bytes')
            GUICtrlSetData($Label42, _Str($Data[8 ]) & ' bytes')
            GUICtrlSetData($Label41 + 1, StringFormat('%.2f', $Data[14] / 1024 / 1024) & ' MB')
            GUICtrlSetData($Label42 + 1, StringFormat('%.2f', $Data[8 ] / 1024 / 1024) & ' MB')
        Else
            GUICtrlSetData($Label41, '')
            GUICtrlSetData($Label42, '')
        EndIf
        $Timer = TimerInit()
        $pIndex = $Index
    EndIf
    $Index = _GUICtrlComboBox_GetCurSel($Combo) + 1
EndFunc


saavaage 23-08-2010 19:51 1480253

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

Пример сейчас откорректирую и выложу без лишних инклюдов (просто вырезал наспех, извините)

Вот:

читать дальше »
Код:

#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <TabConstants.au3>
#include <WindowsConstants.au3>
#Include <ComboConstants.au3>
#Include <GUIComboBox.au3>
#Include <GUIConstantsEx.au3>
#Include <StaticConstants.au3>

Global Const $MIB_IF_TYPE_OTHER = 1
Global Const $MIB_IF_TYPE_ETHERNET_CSMACD = 6
Global Const $MIB_IF_TYPE_ISO88025_TOKENRING = 9
Global Const $MIB_IF_TYPE_PPP = 23
Global Const $MIB_IF_TYPE_SOFTWARE_LOOPBACK = 24
Global Const $MIB_IF_TYPE_ATM = 37
Global Const $MIB_IF_TYPE_IEEE80211 = 71
Global Const $MIB_IF_TYPE_TUNNEL = 131
Global Const $MIB_IF_TYPE_IEEE1394 = 144

Global Const $MIB_IF_ADMIN_STATUS_UP = 1
Global Const $MIB_IF_ADMIN_STATUS_DOWN = 2
Global Const $MIB_IF_ADMIN_STATUS_TESTING = 3

Global Const $MIB_IF_OPER_STATUS_NON_OPERATIONAL = 0
Global Const $MIB_IF_OPER_STATUS_UNREACHABLE = 1
Global Const $MIB_IF_OPER_STATUS_DISCONNECTED = 2
Global Const $MIB_IF_OPER_STATUS_CONNECTING = 3
Global Const $MIB_IF_OPER_STATUS_CONNECTED = 4
Global Const $MIB_IF_OPER_STATUS_OPERATIONAL = 5

Global Const $tagMIB_IFROW = 'wchar Name[256];dword Index;dword Type;dword Mtu;dword Speed;dword PhysAddrLen;byte PhysAddr[8];dword AdminStatus;dword OperStatus;dword LastChange;dword InOctets;dword InUcastPkts;dword InNUcastPkts;dword InDiscards;dword InErrors;dword InUnknownProtos;dword OutOctets;dword OutUcastPkts;dword OutNUcastPkts;dword OutDiscards;dword OutErrors;dword OutQLen;dword DescrLen;char Descr[256]'

Global $Dll, $Combo, $Label41, $Label42, $Timer, $Data, $Index = 0, $pIndex = 0, $Adapter[1][3] = [[0]]


Opt("GUIOnEventMode", 1)

$hMain_GUI = GUICreate("Диагностика и Настройка", 619, 442, 189, 122)
GUISetIcon('setupapi.dll', 1)
GUISetFont(8.5, 400, 0, 'MS Shell Dlg')
GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSEClicked")

$Tab1 = GUICtrlCreateTab(8, 16, 601, 377)

;;;; Network ;;;;
$Network = GUICtrlCreateTabItem("Network")

;; интернет  - адаптеры
$Dll = DllOpen('IPHlpApi.dll')

$Data = _WinAPI_GetIfTable($MIB_IF_TYPE_ETHERNET_CSMACD, $Dll)
If Not @error Then
    For $i = 1 To $Data[0][0]
        $Adapter[0][0] += 1
        ReDim $Adapter[$Adapter[0][0] + 1][3]
        $Adapter[$Adapter[0][0]][0] = $Data[$i][1 ] ; Interface index
        $Adapter[$Adapter[0][0]][2] = $Data[$i][19] ; Description
    Next
EndIf

GUICtrlCreateGroup("Интернет-Адаптеры", 16, 288, 585, 97)
GUICtrlCreateLabel("Адаптер:", 32, 309, 49, 17)
$Combo = GUICtrlCreateCombo("", 88, 307,505, 25,  $CBS_DROPDOWNLIST)

If $Adapter[0][0] Then
    For $i = 1 To $Adapter[0][0]
        _GUICtrlComboBox_AddString($Combo, $Adapter[$i][2])
    Next
    $Index = 1
Else
    _GUICtrlComboBox_AddString($Combo, 'None')
    GUICtrlSetState(-1, $GUI_DISABLE)
EndIf
_GUICtrlComboBox_SetCurSel($Combo, 0)
GUICtrlCreateGroup("Трансфер (Bytes + MB):", 24, 333, 569, 44)
GUICtrlCreateLabel("Отдача:", 34, 354, 43, 17)
$Label41 = GUICtrlCreateInput("", 87, 353, 81, 17, $SS_RIGHT)
GUICtrlCreateInput("", 184, 353, 81, 17, $SS_RIGHT)
GUICtrlCreateLabel("Прием:", 346, 354, 43, 17)
$Label42 = GUICtrlCreateInput("", 399, 353, 81, 17, $SS_RIGHT)
GUICtrlCreateInput("", 496, 353, 81, 17, $SS_RIGHT)
_Combo()

DllClose($Dll)

GUICtrlCreateTabItem("")

;;;; Common Buttons ;;;;
$nSettings_Button = GUICtrlCreateButton("Опции", 500, 7, 105, 25)
$nExit_Button = GUICtrlCreateButton("Выход", 535, 400, 70, 33)
GUICtrlSetOnEvent($nExit_Button, "_MainGUI_Events")
GUICtrlSetOnEvent($nSettings_Button, "_MainGUI_Events")
GUISetOnEvent($GUI_EVENT_CLOSE, "_MainGUI_Events", $hMain_GUI)

GUISetState()

While 1
    Sleep(100)
WEnd


Func CLOSEClicked()
  Exit
EndFunc

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;      FUNCTIONS            ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Func _MainGUI_Events()
        Switch @GUI_CtrlId
        Case $GUI_EVENT_CLOSE, $nExit_Button
            Exit
        Case $nSettings_Button
            _Settings_GUI($hMain_GUI)
        EndSwitch
EndFunc

Func _Settings_GUI($hParent)
    Local $iOpt_GOEM, $hSettings_GUI, $nStngs_Close_Button, $nStngs_Save_Button

    $iOpt_GOEM = Opt("GUIOnEventMode", 0)

    $hSettings_GUI = GUICreate("Настройки", 400, 250, -1, -1, -1, -1, $hParent)
    $nStngs_Close_Button = GUICtrlCreateButton("Выход", 20, 220, 60, 20)
    $nStngs_Save_Button = GUICtrlCreateButton("Сохранить", 90, 220, 60, 20)

    GUISetState(@SW_DISABLE, $hParent)
    GUISetState(@SW_SHOW, $hSettings_GUI)

    While 1
          Switch GUIGetMsg()
            Case $GUI_EVENT_CLOSE, $nStngs_Close_Button
                ExitLoop
            Case $nStngs_Save_Button
                MsgBox(64, 'Сохранение настроек', 'Изменения сохранены!', 0, $hSettings_GUI)
                        EndSwitch
    WEnd

    GUISetState(@SW_ENABLE, $hParent)
    GUISetState(@SW_HIDE, $hSettings_GUI)

    Opt("GUIOnEventMode", $iOpt_GOEM)
EndFunc

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;          SECTIONS      ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


;; Network Section ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;; определение текущего АДАПТЕРА и его sent/receive
Func _Combo()
        While 1
    If ($Index) And (($Index <> $pIndex) Or (TimerDiff($Timer) > 1000)) Then
        $Data = _WinAPI_GetIfEntry($Adapter[$Index][0], $Dll)
        If Not @error Then
            GUICtrlSetData($Label41, _Str($Data[14]) & ' bytes')
            GUICtrlSetData($Label42, _Str($Data[8 ]) & ' bytes')
            GUICtrlSetData($Label41 + 1, StringFormat('%.2f', $Data[14] / 1024 / 1024) & ' MB')
            GUICtrlSetData($Label42 + 1, StringFormat('%.2f', $Data[8 ] / 1024 / 1024) & ' MB')
        Else
            GUICtrlSetData($Label41, '')
            GUICtrlSetData($Label42, '')
        EndIf
        $Timer = TimerInit()
        $pIndex = $Index
    EndIf
        $Index = _GUICtrlComboBox_GetCurSel($Combo) + 1
        WEnd
EndFunc


Func _Str($iValue)

    Local $Result = '', $Str = String($iValue)

    While StringLen($Str)
        $Result = '.' & StringRight($Str, 3) & $Result
        $Str = StringTrimRight($Str, 3)
    WEnd
    Return StringTrimLeft($Result, 1)
EndFunc  ;==>_Str

Func _WinAPI_GetIfEntry($iIndex, $Dll = -1)

    Local $Ret, $Data, $Addr, $Count
    Local $tMIB_IFROW

    If $Dll < 0 Then
        $Dll = 'IPHlpApi.dll'
    EndIf

    $tMIB_IFROW = DllStructCreate($tagMIB_IFROW)
    DllStructSetData($tMIB_IFROW, 2, $iIndex)
    $Ret = DLLCall($Dll, 'dword', 'GetIfEntry', 'ptr', DllStructGetPtr($tMIB_IFROW))
    If (@error) Or ($Ret[0]) Then
        Return SetError($Ret[0], 0, 0)
    EndIf
    Dim $Data[20]
    $Data[0 ] = DllStructGetData($tMIB_IFROW, 'Name')
    $Data[1 ] = $iIndex
    $Data[2 ] = DllStructGetData($tMIB_IFROW, 'Type')
    $Data[3 ] = DllStructGetData($tMIB_IFROW, 'Mtu')
    $Data[4 ] = DllStructGetData($tMIB_IFROW, 'Speed')
    $Count = DllStructGetData($tMIB_IFROW, 'PhysAddrLen')
    $Addr = ''
    For $i = 1 To $Count
        $Addr &= Hex(DllStructGetData($tMIB_IFROW, 'PhysAddr', $i), 2) & '-'
    Next
    $Data[5 ] = StringTrimRight($Addr, 1)
    $Data[6 ] = DllStructGetData($tMIB_IFROW, 'AdminStatus')
    $Data[7 ] = DllStructGetData($tMIB_IFROW, 'OperStatus')
    $Data[8 ] = DllStructGetData($tMIB_IFROW, 'InOctets')
    $Data[9 ] = DllStructGetData($tMIB_IFROW, 'InUcastPkts')
    $Data[10] = DllStructGetData($tMIB_IFROW, 'InNUcastPkts')
    $Data[11] = DllStructGetData($tMIB_IFROW, 'InDiscards')
    $Data[12] = DllStructGetData($tMIB_IFROW, 'InErrors')
    $Data[13] = DllStructGetData($tMIB_IFROW, 'InUnknownProtos')
    $Data[14] = DllStructGetData($tMIB_IFROW, 'OutOctets')
    $Data[15] = DllStructGetData($tMIB_IFROW, 'OutUcastPkts')
    $Data[16] = DllStructGetData($tMIB_IFROW, 'OutNUcastPkts')
    $Data[17] = DllStructGetData($tMIB_IFROW, 'OutDiscards')
    $Data[18] = DllStructGetData($tMIB_IFROW, 'OutErrors')
    $Data[19] = StringLeft(DllStructGetData($tMIB_IFROW, 'Descr'), DllStructGetData($tMIB_IFROW, 'DescrLen') - 1)
    Return $Data
EndFunc  ;==>_WinAPI_GetIfEntry

Func _WinAPI_GetIfTable($iType = 0, $Dll = -1)

    Local $Ret, $Row, $Type, $Tag, $Tab, $Addr, $Count, $Lenght
    Local $tMIB_IFTABLE, $tMIB_IFROW

    If $Dll < 0 Then
        $Dll = 'IPHlpApi.dll'
    EndIf

    $tMIB_IFROW = DllStructCreate($tagMIB_IFROW)
    $Row = 'byte[' & DllStructGetSize($tMIB_IFROW) & ']'
    $Tag = 'dword;'
    For $i = 1 To 32
        $Tag &= $Row & ';'
    Next
    $tMIB_IFTABLE = DllStructCreate($Tag)
    $Ret = DLLCall($Dll, 'dword', 'GetIfTable', 'ptr', DllStructGetPtr($tMIB_IFTABLE), 'long*', DllStructGetSize($tMIB_IFTABLE), 'int', 1)
    If (@error) Or ($Ret[0]) Then
        Return SetError($Ret[0], 0, 0)
    EndIf
    $Count = DllStructGetData($tMIB_IFTABLE, 1)
    Dim $Tab[$Count + 1][20]
    $Tab[0][0] = 0
    For $i = 1 To $Count
        $tMIB_IFROW = DllStructCreate($tagMIB_IFROW, DllStructGetPtr($tMIB_IFTABLE, $i + 1))
        $Type = DllStructGetData($tMIB_IFROW, 'Type')
        If ($iType = 0) Or ($iType = $Type) Then
            $Tab[0][0] += 1
            $Tab[$Tab[0][0]][0 ] = DllStructGetData($tMIB_IFROW, 'Name')
            $Tab[$Tab[0][0]][1 ] = DllStructGetData($tMIB_IFROW, 'Index')
            $Tab[$Tab[0][0]][2 ] = $Type
            $Tab[$Tab[0][0]][3 ] = DllStructGetData($tMIB_IFROW, 'Mtu')
            $Tab[$Tab[0][0]][4 ] = DllStructGetData($tMIB_IFROW, 'Speed')
            $Lenght = DllStructGetData($tMIB_IFROW, 'PhysAddrLen')
            $Addr = ''
            For $j = 1 To $Lenght
                $Addr &= Hex(DllStructGetData($tMIB_IFROW, 'PhysAddr', $j), 2) & '-'
            Next
            $Tab[$Tab[0][0]][5 ] = StringTrimRight($Addr, 1)
            $Tab[$Tab[0][0]][6 ] = DllStructGetData($tMIB_IFROW, 'AdminStatus')
            $Tab[$Tab[0][0]][7 ] = DllStructGetData($tMIB_IFROW, 'OperStatus')
            $Tab[$Tab[0][0]][8 ] = DllStructGetData($tMIB_IFROW, 'InOctets')
            $Tab[$Tab[0][0]][9 ] = DllStructGetData($tMIB_IFROW, 'InUcastPkts')
            $Tab[$Tab[0][0]][10] = DllStructGetData($tMIB_IFROW, 'InNUcastPkts')
            $Tab[$Tab[0][0]][11] = DllStructGetData($tMIB_IFROW, 'InDiscards')
            $Tab[$Tab[0][0]][12] = DllStructGetData($tMIB_IFROW, 'InErrors')
            $Tab[$Tab[0][0]][13] = DllStructGetData($tMIB_IFROW, 'InUnknownProtos')
            $Tab[$Tab[0][0]][14] = DllStructGetData($tMIB_IFROW, 'OutOctets')
            $Tab[$Tab[0][0]][15] = DllStructGetData($tMIB_IFROW, 'OutUcastPkts')
            $Tab[$Tab[0][0]][16] = DllStructGetData($tMIB_IFROW, 'OutNUcastPkts')
            $Tab[$Tab[0][0]][17] = DllStructGetData($tMIB_IFROW, 'OutDiscards')
            $Tab[$Tab[0][0]][18] = DllStructGetData($tMIB_IFROW, 'OutErrors')
            $Tab[$Tab[0][0]][19] = StringLeft(DllStructGetData($tMIB_IFROW, 'Descr'), DllStructGetData($tMIB_IFROW, 'DescrLen') - 1)
        EndIf
    Next
    If $Tab[0][0] < $Count Then
        ReDim $Tab[$Tab[0][0] + 1][20]
    EndIf
    Return $Tab
EndFunc  ;==>_WinAPI_GetIfTable

;; конец определение текущего адаптера и его sent/receive

;; End Network  Section  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;



PS шапку тоже поправил

FlatX007 23-08-2010 20:25 1480275

А зачем нужен режим EventMode ? обычным никак что ли ?

saavaage 23-08-2010 20:34 1480285

FlatX007, Creat0R посоветовал (http://forum.oszone.net/post-1478430-9.html). Мне так показалось более изящнее, чтоли. Вроде все работало, так вот взялся переделать и нарвался на косяк...

PS просто на форме много вкладок и все с обработкой инфы + по кнопкам. Если все кнопки "повесить" на MessageLoop, боюсь будут проблемы.

FlatX007 23-08-2010 20:51 1480295

Я не работал с этим режимом, мне так и не удалось считать "активный" таб в режиме EventMode.

Цитата:

Цитата saavaage
Если все кнопки "повесить" на MessageLoop, боюсь будут проблемы. »

Проблем не будет никаких!

Пример с табами:
Код:

$Form1 = GUICreate("Test", 250, 106, 192, 124)
$Tab1 = GUICtrlCreateTab(0, 0, 249, 105)
$TabSheet1 = GUICtrlCreateTabItem("Вкладка одЫн")
$TabSheet2 = GUICtrlCreateTabItem("Вкладка два")
GUICtrlCreateTabItem("")
GUISetState(@SW_SHOW)

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case -3
            Exit
        Case
$Tab1
            ConsoleWrite("Активный таб - " & GUICtrlRead($Tab1) & @CRLF)
    EndSwitch
WEnd


saavaage 23-08-2010 21:07 1480311

FlatX007, у меня раньше и был этот режим. Взялся переделывать на перспективу. Практически все уже адаптировал и вот...
Подождем, что скажут остальные участники...

Пока могу только выложить скрипт, на основе которого я и извращался..

читать дальше »
Код:

cs ----------------------------------------------------------------------------

 AutoIt Version: 3.3.0.0
 Author:        Yashied

 Script Function:
    Traffic metter. (Example)

#ce ----------------------------------------------------------------------------

#Region Initialization

#NoTrayIcon

#Include <ComboConstants.au3>
#Include <GUIComboBox.au3>
#Include <GUIConstantsEx.au3>
#Include <StaticConstants.au3>
#Include <WindowsConstants.au3>

Opt('MustDeclareVars', 1)

Global Const $MIB_IF_TYPE_OTHER = 1
Global Const $MIB_IF_TYPE_ETHERNET_CSMACD = 6
Global Const $MIB_IF_TYPE_ISO88025_TOKENRING = 9
Global Const $MIB_IF_TYPE_PPP = 23
Global Const $MIB_IF_TYPE_SOFTWARE_LOOPBACK = 24
Global Const $MIB_IF_TYPE_ATM = 37
Global Const $MIB_IF_TYPE_IEEE80211 = 71
Global Const $MIB_IF_TYPE_TUNNEL = 131
Global Const $MIB_IF_TYPE_IEEE1394 = 144

Global Const $MIB_IF_ADMIN_STATUS_UP = 1
Global Const $MIB_IF_ADMIN_STATUS_DOWN = 2
Global Const $MIB_IF_ADMIN_STATUS_TESTING = 3

Global Const $MIB_IF_OPER_STATUS_NON_OPERATIONAL = 0
Global Const $MIB_IF_OPER_STATUS_UNREACHABLE = 1
Global Const $MIB_IF_OPER_STATUS_DISCONNECTED = 2
Global Const $MIB_IF_OPER_STATUS_CONNECTING = 3
Global Const $MIB_IF_OPER_STATUS_CONNECTED = 4
Global Const $MIB_IF_OPER_STATUS_OPERATIONAL = 5

Global Const $tagMIB_IFROW = 'wchar Name[256];dword Index;dword Type;dword Mtu;dword Speed;dword PhysAddrLen;byte PhysAddr[8];dword AdminStatus;dword OperStatus;dword LastChange;dword InOctets;dword InUcastPkts;dword InNUcastPkts;dword InDiscards;dword InErrors;dword InUnknownProtos;dword OutOctets;dword OutUcastPkts;dword OutNUcastPkts;dword OutDiscards;dword OutErrors;dword OutQLen;dword DescrLen;char Descr[256]'

Global $hParent, $hForm, $Dll, $Msg, $Combo, $Label1, $Label2, $Timer, $Data, $Index = 0, $pIndex = 0, $Adapter[1][3] = [[0]]

$Dll = DllOpen('IPHlpApi.dll')

$Data = _WinAPI_GetIfTable($MIB_IF_TYPE_ETHERNET_CSMACD, $Dll)
If Not @error Then
    For $i = 1 To $Data[0][0]
        $Adapter[0][0] += 1
        ReDim $Adapter[$Adapter[0][0] + 1][3]
        $Adapter[$Adapter[0][0]][0] = $Data[$i][1 ] ; Interface index
        $Adapter[$Adapter[0][0]][1] = $Data[$i][5 ] ; Adapter physical address (MAC)
        $Adapter[$Adapter[0][0]][2] = $Data[$i][19] ; Description
    Next
EndIf

#EndRegion Initialization

#Region Main State

$hParent = GUICreate('', -1, -1, -1, -1, -1, $WS_EX_TOOLWINDOW)
$hForm = GUICreate('?', 400, 155, -1, -1, BitOR($WS_CAPTION, $WS_SYSMENU), $WS_EX_TOPMOST, $hParent)
GUISetFont(8.5, 400, 0, 'MS Shell Dlg', $hForm)
GUISetIcon('setupapi.dll', 5)
GUICtrlCreateLabel('Adapter:', 14, 20, 44, 14)
$Combo = GUICtrlCreateCombo('', 60, 16, 326, 21, $CBS_DROPDOWNLIST)
If $Adapter[0][0] Then
    For $i = 1 To $Adapter[0][0]
        _GUICtrlComboBox_AddString($Combo, $Adapter[$i][2])
    Next
    WinSetTitle($hForm, '', $Adapter[1][1])
    $Index = 1
Else
    _GUICtrlComboBox_AddString($Combo, 'None')
    GUICtrlSetState(-1, $GUI_DISABLE)
EndIf
_GUICtrlComboBox_SetCurSel($Combo, 0)
GUiCtrlCreateGroup('Transfer (Bytes)', 14, 50, 372, 91)
GUICtrlCreateLabel('Sent:', 30, 80, 52, 14)
$Label1 = GUICtrlCreateLabel('', 86, 80, 106, 14, $SS_RIGHT)
GUICtrlCreateLabel('', 204, 80, 70, 14, $SS_RIGHT)
GUICtrlCreateLabel('Received:', 30, 104, 52, 14)
$Label2 = GUICtrlCreateLabel('', 86, 104, 106, 14, $SS_RIGHT)
GUICtrlCreateLabel('', 204, 104, 70, 14, $SS_RIGHT)
GUISetState()

While 1
    If ($Index) And (($Index <> $pIndex) Or (TimerDiff($Timer) > 1000)) Then
        $Data = _WinAPI_GetIfEntry($Adapter[$Index][0], $Dll)
        If Not @error Then
            GUICtrlSetData($Label1, _Str($Data[14]) & ' bytes')
            GUICtrlSetData($Label2, _Str($Data[8 ]) & ' bytes')
            GUICtrlSetData($Label1 + 1, StringFormat('%.2f', $Data[14] / 1024 / 1024) & ' MB')
            GUICtrlSetData($Label2 + 1, StringFormat('%.2f', $Data[8 ] / 1024 / 1024) & ' MB')
        Else
            GUICtrlSetData($Label1, '')
            GUICtrlSetData($Label2, '')
        EndIf
        $Timer = TimerInit()
        $pIndex = $Index
    EndIf
    $Msg = GUIGetMsg()
    Switch $Msg
        Case $GUI_EVENT_CLOSE
            ExitLoop
        Case $Combo
            $Index = _GUICtrlComboBox_GetCurSel($Combo) + 1
            WinSetTitle($hForm, '', $Adapter[$Index][1])
    EndSwitch
WEnd

DllClose($Dll)

#EndRegion Main State

#Region Additional Functions

Func _Str($iValue)

    Local $Result = '', $Str = String($iValue)

    While StringLen($Str)
        $Result = '.' & StringRight($Str, 3) & $Result
        $Str = StringTrimRight($Str, 3)
    WEnd
    Return StringTrimLeft($Result, 1)
EndFunc  ;==>_Str

Func _WinAPI_GetIfEntry($iIndex, $Dll = -1)

    Local $Ret, $Data, $Addr, $Count
    Local $tMIB_IFROW

    If $Dll < 0 Then
        $Dll = 'IPHlpApi.dll'
    EndIf

    $tMIB_IFROW = DllStructCreate($tagMIB_IFROW)
    DllStructSetData($tMIB_IFROW, 2, $iIndex)
    $Ret = DLLCall($Dll, 'dword', 'GetIfEntry', 'ptr', DllStructGetPtr($tMIB_IFROW))
    If (@error) Or ($Ret[0]) Then
        Return SetError($Ret[0], 0, 0)
    EndIf
    Dim $Data[20]
    $Data[0 ] = DllStructGetData($tMIB_IFROW, 'Name')
    $Data[1 ] = $iIndex
    $Data[2 ] = DllStructGetData($tMIB_IFROW, 'Type')
    $Data[3 ] = DllStructGetData($tMIB_IFROW, 'Mtu')
    $Data[4 ] = DllStructGetData($tMIB_IFROW, 'Speed')
    $Count = DllStructGetData($tMIB_IFROW, 'PhysAddrLen')
    $Addr = ''
    For $i = 1 To $Count
        $Addr &= Hex(DllStructGetData($tMIB_IFROW, 'PhysAddr', $i), 2) & '-'
    Next
    $Data[5 ] = StringTrimRight($Addr, 1)
    $Data[6 ] = DllStructGetData($tMIB_IFROW, 'AdminStatus')
    $Data[7 ] = DllStructGetData($tMIB_IFROW, 'OperStatus')
    $Data[8 ] = DllStructGetData($tMIB_IFROW, 'InOctets')
    $Data[9 ] = DllStructGetData($tMIB_IFROW, 'InUcastPkts')
    $Data[10] = DllStructGetData($tMIB_IFROW, 'InNUcastPkts')
    $Data[11] = DllStructGetData($tMIB_IFROW, 'InDiscards')
    $Data[12] = DllStructGetData($tMIB_IFROW, 'InErrors')
    $Data[13] = DllStructGetData($tMIB_IFROW, 'InUnknownProtos')
    $Data[14] = DllStructGetData($tMIB_IFROW, 'OutOctets')
    $Data[15] = DllStructGetData($tMIB_IFROW, 'OutUcastPkts')
    $Data[16] = DllStructGetData($tMIB_IFROW, 'OutNUcastPkts')
    $Data[17] = DllStructGetData($tMIB_IFROW, 'OutDiscards')
    $Data[18] = DllStructGetData($tMIB_IFROW, 'OutErrors')
    $Data[19] = StringLeft(DllStructGetData($tMIB_IFROW, 'Descr'), DllStructGetData($tMIB_IFROW, 'DescrLen') - 1)
    Return $Data
EndFunc  ;==>_WinAPI_GetIfEntry

Func _WinAPI_GetIfTable($iType = 0, $Dll = -1)

    Local $Ret, $Row, $Type, $Tag, $Tab, $Addr, $Count, $Lenght
    Local $tMIB_IFTABLE, $tMIB_IFROW

    If $Dll < 0 Then
        $Dll = 'IPHlpApi.dll'
    EndIf

    $tMIB_IFROW = DllStructCreate($tagMIB_IFROW)
    $Row = 'byte[' & DllStructGetSize($tMIB_IFROW) & ']'
    $Tag = 'dword;'
    For $i = 1 To 32
        $Tag &= $Row & ';'
    Next
    $tMIB_IFTABLE = DllStructCreate($Tag)
    $Ret = DLLCall($Dll, 'dword', 'GetIfTable', 'ptr', DllStructGetPtr($tMIB_IFTABLE), 'long*', DllStructGetSize($tMIB_IFTABLE), 'int', 1)
    If (@error) Or ($Ret[0]) Then
        Return SetError($Ret[0], 0, 0)
    EndIf
    $Count = DllStructGetData($tMIB_IFTABLE, 1)
    Dim $Tab[$Count + 1][20]
    $Tab[0][0] = 0
    For $i = 1 To $Count
        $tMIB_IFROW = DllStructCreate($tagMIB_IFROW, DllStructGetPtr($tMIB_IFTABLE, $i + 1))
        $Type = DllStructGetData($tMIB_IFROW, 'Type')
        If ($iType = 0) Or ($iType = $Type) Then
            $Tab[0][0] += 1
            $Tab[$Tab[0][0]][0 ] = DllStructGetData($tMIB_IFROW, 'Name')
            $Tab[$Tab[0][0]][1 ] = DllStructGetData($tMIB_IFROW, 'Index')
            $Tab[$Tab[0][0]][2 ] = $Type
            $Tab[$Tab[0][0]][3 ] = DllStructGetData($tMIB_IFROW, 'Mtu')
            $Tab[$Tab[0][0]][4 ] = DllStructGetData($tMIB_IFROW, 'Speed')
            $Lenght = DllStructGetData($tMIB_IFROW, 'PhysAddrLen')
            $Addr = ''
            For $j = 1 To $Lenght
                $Addr &= Hex(DllStructGetData($tMIB_IFROW, 'PhysAddr', $j), 2) & '-'
            Next
            $Tab[$Tab[0][0]][5 ] = StringTrimRight($Addr, 1)
            $Tab[$Tab[0][0]][6 ] = DllStructGetData($tMIB_IFROW, 'AdminStatus')
            $Tab[$Tab[0][0]][7 ] = DllStructGetData($tMIB_IFROW, 'OperStatus')
            $Tab[$Tab[0][0]][8 ] = DllStructGetData($tMIB_IFROW, 'InOctets')
            $Tab[$Tab[0][0]][9 ] = DllStructGetData($tMIB_IFROW, 'InUcastPkts')
            $Tab[$Tab[0][0]][10] = DllStructGetData($tMIB_IFROW, 'InNUcastPkts')
            $Tab[$Tab[0][0]][11] = DllStructGetData($tMIB_IFROW, 'InDiscards')
            $Tab[$Tab[0][0]][12] = DllStructGetData($tMIB_IFROW, 'InErrors')
            $Tab[$Tab[0][0]][13] = DllStructGetData($tMIB_IFROW, 'InUnknownProtos')
            $Tab[$Tab[0][0]][14] = DllStructGetData($tMIB_IFROW, 'OutOctets')
            $Tab[$Tab[0][0]][15] = DllStructGetData($tMIB_IFROW, 'OutUcastPkts')
            $Tab[$Tab[0][0]][16] = DllStructGetData($tMIB_IFROW, 'OutNUcastPkts')
            $Tab[$Tab[0][0]][17] = DllStructGetData($tMIB_IFROW, 'OutDiscards')
            $Tab[$Tab[0][0]][18] = DllStructGetData($tMIB_IFROW, 'OutErrors')
            $Tab[$Tab[0][0]][19] = StringLeft(DllStructGetData($tMIB_IFROW, 'Descr'), DllStructGetData($tMIB_IFROW, 'DescrLen') - 1)
        EndIf
    Next
    If $Tab[0][0] < $Count Then
        ReDim $Tab[$Tab[0][0] + 1][20]
    EndIf
    Return $Tab
EndFunc  ;==>_WinAPI_GetIfTable

#EndRegion Windows Message Functions


Creat0R 23-08-2010 22:18 1480360

Цитата:

Цитата saavaage
Проблема - как только подключаю цикл в функции _Combo() (While 1 .... Wend), перестает отображаться окно формы на экране »

Ну а что ты ожидал, _Combo крутит вечный цикл, дело до показа GUI (GUISetState) не доходит.
Какова цель этого цикла? если вместо главного, то просто поставь вызов этой функций вместо основново цикла:

Код:

GUISetState()

_Combo()


saavaage 23-08-2010 22:31 1480369

Creat0R, цель - отображать текущее состояние sent/receive адаптеров. При выборе любого из списка (у меня их 2) показывается в режиме реального времени их работа-трафик.

Creat0R 24-08-2010 00:33 1480452

Цитата:

Цитата saavaage
отображать текущее состояние sent/receive адаптеров. При выборе любого из списка (у меня их 2) показывается в режиме реального времени их работа-трафик. »

Это вызывает большую нагрузку на процессор. Лучше это делать через AdlibRegister один раз в секунду, а события Combo повесить в функцию «_MainGUI_Events».

saavaage 24-08-2010 00:36 1480455

Creat0R, в посте http://forum.oszone.net/post-1480311-7.html пример, на основе которого я и ... Там ЦП -0% загрузки.

Creat0R 24-08-2010 00:53 1480466

Цитата:

Цитата saavaage
Там ЦП -0% загрузки »

Ну всё верно, там используется GUIGetMsg (в ней уже предусмотрена пауза чтобы предотвратить нагрузку на ЦП), т.е режим MessageLoop.

saavaage 24-08-2010 00:59 1480468

Creat0R, не совсем понял, как это сделать. Попробовал так и результат =0:

читать дальше »
Код:

#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <TabConstants.au3>
#include <WindowsConstants.au3>
#Include <ComboConstants.au3>
#Include <GUIComboBox.au3>
#Include <GUIConstantsEx.au3>
#Include <StaticConstants.au3>

Global Const $MIB_IF_TYPE_OTHER = 1
Global Const $MIB_IF_TYPE_ETHERNET_CSMACD = 6
Global Const $MIB_IF_TYPE_ISO88025_TOKENRING = 9
Global Const $MIB_IF_TYPE_PPP = 23
Global Const $MIB_IF_TYPE_SOFTWARE_LOOPBACK = 24
Global Const $MIB_IF_TYPE_ATM = 37
Global Const $MIB_IF_TYPE_IEEE80211 = 71
Global Const $MIB_IF_TYPE_TUNNEL = 131
Global Const $MIB_IF_TYPE_IEEE1394 = 144

Global Const $MIB_IF_ADMIN_STATUS_UP = 1
Global Const $MIB_IF_ADMIN_STATUS_DOWN = 2
Global Const $MIB_IF_ADMIN_STATUS_TESTING = 3

Global Const $MIB_IF_OPER_STATUS_NON_OPERATIONAL = 0
Global Const $MIB_IF_OPER_STATUS_UNREACHABLE = 1
Global Const $MIB_IF_OPER_STATUS_DISCONNECTED = 2
Global Const $MIB_IF_OPER_STATUS_CONNECTING = 3
Global Const $MIB_IF_OPER_STATUS_CONNECTED = 4
Global Const $MIB_IF_OPER_STATUS_OPERATIONAL = 5

Global Const $tagMIB_IFROW = 'wchar Name[256];dword Index;dword Type;dword Mtu;dword Speed;dword PhysAddrLen;byte PhysAddr[8];dword AdminStatus;dword OperStatus;dword LastChange;dword InOctets;dword InUcastPkts;dword InNUcastPkts;dword InDiscards;dword InErrors;dword InUnknownProtos;dword OutOctets;dword OutUcastPkts;dword OutNUcastPkts;dword OutDiscards;dword OutErrors;dword OutQLen;dword DescrLen;char Descr[256]'

Global $Dll, $Combo, $Label41, $Label42, $Timer, $Data, $Index = 0, $pIndex = 0, $Adapter[1][3] = [[0]]


Opt("GUIOnEventMode", 1)

$hMain_GUI = GUICreate("Диагностика и Настройка", 619, 442, 189, 122)
GUISetIcon('setupapi.dll', 1)
GUISetFont(8.5, 400, 0, 'MS Shell Dlg')
GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSEClicked")

$Tab1 = GUICtrlCreateTab(8, 16, 601, 377)

;;;; Network ;;;;
$Network = GUICtrlCreateTabItem("Network")

;; интернет  - адаптеры
$Dll = DllOpen('IPHlpApi.dll')

$Data = _WinAPI_GetIfTable($MIB_IF_TYPE_ETHERNET_CSMACD, $Dll)
If Not @error Then
    For $i = 1 To $Data[0][0]
        $Adapter[0][0] += 1
        ReDim $Adapter[$Adapter[0][0] + 1][3]
        $Adapter[$Adapter[0][0]][0] = $Data[$i][1 ] ; Interface index
        $Adapter[$Adapter[0][0]][2] = $Data[$i][19] ; Description
    Next
EndIf

GUICtrlCreateGroup("Интернет-Адаптеры", 16, 288, 585, 97)
GUICtrlCreateLabel("Адаптер:", 32, 309, 49, 17)
$Combo = GUICtrlCreateCombo("", 88, 307,505, 25,  $CBS_DROPDOWNLIST)
GUICtrlSetOnEvent($Combo, "_MainGUI_Events")
If $Adapter[0][0] Then
    For $i = 1 To $Adapter[0][0]
        _GUICtrlComboBox_AddString($Combo, $Adapter[$i][2])
    Next
    $Index = 1
Else
    _GUICtrlComboBox_AddString($Combo, 'None')
    GUICtrlSetState(-1, $GUI_DISABLE)
EndIf
_GUICtrlComboBox_SetCurSel($Combo, 0)
GUICtrlCreateGroup("Трансфер (Bytes + MB):", 24, 333, 569, 44)
GUICtrlCreateLabel("Отдача:", 34, 354, 43, 17)
$Label41 = GUICtrlCreateInput("", 87, 353, 81, 17, $SS_RIGHT)
GUICtrlCreateInput("", 184, 353, 81, 17, $SS_RIGHT)
GUICtrlCreateLabel("Прием:", 346, 354, 43, 17)
$Label42 = GUICtrlCreateInput("", 399, 353, 81, 17, $SS_RIGHT)
GUICtrlCreateInput("", 496, 353, 81, 17, $SS_RIGHT)

AdlibRegister("_Combo")

DllClose($Dll)

GUICtrlCreateTabItem("")

;;;; Common Buttons ;;;;
$nSettings_Button = GUICtrlCreateButton("Опции", 500, 7, 105, 25)
$nExit_Button = GUICtrlCreateButton("Выход", 535, 400, 70, 33)
GUICtrlSetOnEvent($nExit_Button, "_MainGUI_Events")
GUICtrlSetOnEvent($nSettings_Button, "_MainGUI_Events")
GUISetOnEvent($GUI_EVENT_CLOSE, "_MainGUI_Events", $hMain_GUI)

GUISetState()

While 1
    Sleep(100)
WEnd


Func CLOSEClicked()
  Exit
EndFunc

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;      FUNCTIONS            ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Func _MainGUI_Events()
        Switch @GUI_CtrlId
        Case $GUI_EVENT_CLOSE, $nExit_Button
            Exit
        Case $nSettings_Button
            _Settings_GUI($hMain_GUI)
                case $Combo
            $Index = _GUICtrlComboBox_GetCurSel($Combo) + 1

        EndSwitch
EndFunc

Func _Settings_GUI($hMain_GUI)
    Local $iOpt_GOEM, $hSettings_GUI, $nStngs_Close_Button, $nStngs_Save_Button

    $iOpt_GOEM = Opt("GUIOnEventMode", 0)

    $hSettings_GUI = GUICreate("Настройки", 400, 250, -1, -1, -1, -1, $hMain_GUI)
    $nStngs_Close_Button = GUICtrlCreateButton("Выход", 20, 220, 60, 20)
    $nStngs_Save_Button = GUICtrlCreateButton("Сохранить", 90, 220, 60, 20)

    GUISetState(@SW_DISABLE, $hMain_GUI)
    GUISetState(@SW_SHOW, $hSettings_GUI)

    While 1
          Switch GUIGetMsg()
            Case $GUI_EVENT_CLOSE, $nStngs_Close_Button
                ExitLoop
            Case $nStngs_Save_Button
                MsgBox(64, 'Сохранение настроек', 'Изменения сохранены!', 0, $hSettings_GUI)
                        EndSwitch
    WEnd

    GUISetState(@SW_ENABLE, $hMain_GUI)
    GUISetState(@SW_HIDE, $hSettings_GUI)

    Opt("GUIOnEventMode", $iOpt_GOEM)
EndFunc

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;          SECTIONS      ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


;; Network Section ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;; определение текущего АДАПТЕРА и его sent/receive
Func _Combo()

    If ($Index) And (($Index <> $pIndex) Or (TimerDiff($Timer) > 1000)) Then
        $Data = _WinAPI_GetIfEntry($Adapter[$Index][0], $Dll)
        If Not @error Then
            GUICtrlSetData($Label41, _Str($Data[14]) & ' bytes')
            GUICtrlSetData($Label42, _Str($Data[8 ]) & ' bytes')
            GUICtrlSetData($Label41 + 1, StringFormat('%.2f', $Data[14] / 1024 / 1024) & ' MB')
            GUICtrlSetData($Label42 + 1, StringFormat('%.2f', $Data[8 ] / 1024 / 1024) & ' MB')
        Else
            GUICtrlSetData($Label41, '')
            GUICtrlSetData($Label42, '')
        EndIf
        $Timer = TimerInit()
        $pIndex = $Index
    EndIf
        $Index = _GUICtrlComboBox_GetCurSel($Combo) + 1
EndFunc



Func _Str($iValue)

    Local $Result = '', $Str = String($iValue)

    While StringLen($Str)
        $Result = '.' & StringRight($Str, 3) & $Result
        $Str = StringTrimRight($Str, 3)
    WEnd
    Return StringTrimLeft($Result, 1)
EndFunc  ;==>_Str

Func _WinAPI_GetIfEntry($iIndex, $Dll = -1)

    Local $Ret, $Data, $Addr, $Count
    Local $tMIB_IFROW

    If $Dll < 0 Then
        $Dll = 'IPHlpApi.dll'
    EndIf

    $tMIB_IFROW = DllStructCreate($tagMIB_IFROW)
    DllStructSetData($tMIB_IFROW, 2, $iIndex)
    $Ret = DLLCall($Dll, 'dword', 'GetIfEntry', 'ptr', DllStructGetPtr($tMIB_IFROW))
    If (@error) Or ($Ret[0]) Then
        Return SetError($Ret[0], 0, 0)
    EndIf
    Dim $Data[20]
    $Data[0 ] = DllStructGetData($tMIB_IFROW, 'Name')
    $Data[1 ] = $iIndex
    $Data[2 ] = DllStructGetData($tMIB_IFROW, 'Type')
    $Data[3 ] = DllStructGetData($tMIB_IFROW, 'Mtu')
    $Data[4 ] = DllStructGetData($tMIB_IFROW, 'Speed')
    $Count = DllStructGetData($tMIB_IFROW, 'PhysAddrLen')
    $Addr = ''
    For $i = 1 To $Count
        $Addr &= Hex(DllStructGetData($tMIB_IFROW, 'PhysAddr', $i), 2) & '-'
    Next
    $Data[5 ] = StringTrimRight($Addr, 1)
    $Data[6 ] = DllStructGetData($tMIB_IFROW, 'AdminStatus')
    $Data[7 ] = DllStructGetData($tMIB_IFROW, 'OperStatus')
    $Data[8 ] = DllStructGetData($tMIB_IFROW, 'InOctets')
    $Data[9 ] = DllStructGetData($tMIB_IFROW, 'InUcastPkts')
    $Data[10] = DllStructGetData($tMIB_IFROW, 'InNUcastPkts')
    $Data[11] = DllStructGetData($tMIB_IFROW, 'InDiscards')
    $Data[12] = DllStructGetData($tMIB_IFROW, 'InErrors')
    $Data[13] = DllStructGetData($tMIB_IFROW, 'InUnknownProtos')
    $Data[14] = DllStructGetData($tMIB_IFROW, 'OutOctets')
    $Data[15] = DllStructGetData($tMIB_IFROW, 'OutUcastPkts')
    $Data[16] = DllStructGetData($tMIB_IFROW, 'OutNUcastPkts')
    $Data[17] = DllStructGetData($tMIB_IFROW, 'OutDiscards')
    $Data[18] = DllStructGetData($tMIB_IFROW, 'OutErrors')
    $Data[19] = StringLeft(DllStructGetData($tMIB_IFROW, 'Descr'), DllStructGetData($tMIB_IFROW, 'DescrLen') - 1)
    Return $Data
EndFunc  ;==>_WinAPI_GetIfEntry

Func _WinAPI_GetIfTable($iType = 0, $Dll = -1)

    Local $Ret, $Row, $Type, $Tag, $Tab, $Addr, $Count, $Lenght
    Local $tMIB_IFTABLE, $tMIB_IFROW

    If $Dll < 0 Then
        $Dll = 'IPHlpApi.dll'
    EndIf

    $tMIB_IFROW = DllStructCreate($tagMIB_IFROW)
    $Row = 'byte[' & DllStructGetSize($tMIB_IFROW) & ']'
    $Tag = 'dword;'
    For $i = 1 To 32
        $Tag &= $Row & ';'
    Next
    $tMIB_IFTABLE = DllStructCreate($Tag)
    $Ret = DLLCall($Dll, 'dword', 'GetIfTable', 'ptr', DllStructGetPtr($tMIB_IFTABLE), 'long*', DllStructGetSize($tMIB_IFTABLE), 'int', 1)
    If (@error) Or ($Ret[0]) Then
        Return SetError($Ret[0], 0, 0)
    EndIf
    $Count = DllStructGetData($tMIB_IFTABLE, 1)
    Dim $Tab[$Count + 1][20]
    $Tab[0][0] = 0
    For $i = 1 To $Count
        $tMIB_IFROW = DllStructCreate($tagMIB_IFROW, DllStructGetPtr($tMIB_IFTABLE, $i + 1))
        $Type = DllStructGetData($tMIB_IFROW, 'Type')
        If ($iType = 0) Or ($iType = $Type) Then
            $Tab[0][0] += 1
            $Tab[$Tab[0][0]][0 ] = DllStructGetData($tMIB_IFROW, 'Name')
            $Tab[$Tab[0][0]][1 ] = DllStructGetData($tMIB_IFROW, 'Index')
            $Tab[$Tab[0][0]][2 ] = $Type
            $Tab[$Tab[0][0]][3 ] = DllStructGetData($tMIB_IFROW, 'Mtu')
            $Tab[$Tab[0][0]][4 ] = DllStructGetData($tMIB_IFROW, 'Speed')
            $Lenght = DllStructGetData($tMIB_IFROW, 'PhysAddrLen')
            $Addr = ''
            For $j = 1 To $Lenght
                $Addr &= Hex(DllStructGetData($tMIB_IFROW, 'PhysAddr', $j), 2) & '-'
            Next
            $Tab[$Tab[0][0]][5 ] = StringTrimRight($Addr, 1)
            $Tab[$Tab[0][0]][6 ] = DllStructGetData($tMIB_IFROW, 'AdminStatus')
            $Tab[$Tab[0][0]][7 ] = DllStructGetData($tMIB_IFROW, 'OperStatus')
            $Tab[$Tab[0][0]][8 ] = DllStructGetData($tMIB_IFROW, 'InOctets')
            $Tab[$Tab[0][0]][9 ] = DllStructGetData($tMIB_IFROW, 'InUcastPkts')
            $Tab[$Tab[0][0]][10] = DllStructGetData($tMIB_IFROW, 'InNUcastPkts')
            $Tab[$Tab[0][0]][11] = DllStructGetData($tMIB_IFROW, 'InDiscards')
            $Tab[$Tab[0][0]][12] = DllStructGetData($tMIB_IFROW, 'InErrors')
            $Tab[$Tab[0][0]][13] = DllStructGetData($tMIB_IFROW, 'InUnknownProtos')
            $Tab[$Tab[0][0]][14] = DllStructGetData($tMIB_IFROW, 'OutOctets')
            $Tab[$Tab[0][0]][15] = DllStructGetData($tMIB_IFROW, 'OutUcastPkts')
            $Tab[$Tab[0][0]][16] = DllStructGetData($tMIB_IFROW, 'OutNUcastPkts')
            $Tab[$Tab[0][0]][17] = DllStructGetData($tMIB_IFROW, 'OutDiscards')
            $Tab[$Tab[0][0]][18] = DllStructGetData($tMIB_IFROW, 'OutErrors')
            $Tab[$Tab[0][0]][19] = StringLeft(DllStructGetData($tMIB_IFROW, 'Descr'), DllStructGetData($tMIB_IFROW, 'DescrLen') - 1)
        EndIf
    Next
    If $Tab[0][0] < $Count Then
        ReDim $Tab[$Tab[0][0] + 1][20]
    EndIf
    Return $Tab
EndFunc  ;==>_WinAPI_GetIfTable

;; конец определение текущего адаптера и его sent/receive

;; End Network  Section  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;



Не ругайте за ошибки/глупость, я еще на Основных понятиях пока "сижу"...

Creat0R 24-08-2010 07:04 1480518

Цитата:

Цитата saavaage
Попробовал так и результат =0 »

А что означает результат не 0? :) у меня и с предыдущими примерами результат 0. У меня вообще ругается в функций _WinAPI_GetIfTable.

Да и ещё, я не совсем понял, зачем закрывать Dll'ку когда она ещё используется?
И таймер насколько я понимаю не нужен, если используется AdlibRegister, то можно сразу время запуска указать:

Код:

#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <TabConstants.au3>
#include <WindowsConstants.au3>
#Include <ComboConstants.au3>
#Include <GUIComboBox.au3>
#Include <GUIConstantsEx.au3>
#Include <EditConstants.au3>
#Include <StaticConstants.au3>

Global Const $MIB_IF_TYPE_OTHER = 1
Global Const $MIB_IF_TYPE_ETHERNET_CSMACD = 6
Global Const $MIB_IF_TYPE_ISO88025_TOKENRING = 9
Global Const $MIB_IF_TYPE_PPP = 23
Global Const $MIB_IF_TYPE_SOFTWARE_LOOPBACK = 24
Global Const $MIB_IF_TYPE_ATM = 37
Global Const $MIB_IF_TYPE_IEEE80211 = 71
Global Const $MIB_IF_TYPE_TUNNEL = 131
Global Const $MIB_IF_TYPE_IEEE1394 = 144

Global Const $MIB_IF_ADMIN_STATUS_UP = 1
Global Const $MIB_IF_ADMIN_STATUS_DOWN = 2
Global Const $MIB_IF_ADMIN_STATUS_TESTING = 3

Global Const $MIB_IF_OPER_STATUS_NON_OPERATIONAL = 0
Global Const $MIB_IF_OPER_STATUS_UNREACHABLE = 1
Global Const $MIB_IF_OPER_STATUS_DISCONNECTED = 2
Global Const $MIB_IF_OPER_STATUS_CONNECTING = 3
Global Const $MIB_IF_OPER_STATUS_CONNECTED = 4
Global Const $MIB_IF_OPER_STATUS_OPERATIONAL = 5

Global Const $tagMIB_IFROW = 'wchar Name[256];dword Index;dword Type;dword Mtu;dword Speed;dword PhysAddrLen;byte PhysAddr[8];dword AdminStatus;dword OperStatus;dword LastChange;dword InOctets;dword InUcastPkts;dword InNUcastPkts;dword InDiscards;dword InErrors;dword InUnknownProtos;dword OutOctets;dword OutUcastPkts;dword OutNUcastPkts;dword OutDiscards;dword OutErrors;dword OutQLen;dword DescrLen;char Descr[256]'

Global $Dll, $Combo, $Label41, $Label42, $Data, $Index = 0, $Adapter[1][3] = [[0]]

Opt("GUIOnEventMode", 1)

$hMain_GUI = GUICreate("Диагностика и Настройка", 615, 440)
GUISetIcon('setupapi.dll', 1)
GUISetFont(8.5, 400, 0, 'MS Shell Dlg')
GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSEClicked")

$Tab1 = GUICtrlCreateTab(8, 16, 601, 377)

;;;; Network ;;;;
$Network = GUICtrlCreateTabItem("Network")

;; интернет  - адаптеры
$Dll = DllOpen(@SystemDir & '\IPHlpApi.dll')
$Data = _WinAPI_GetIfTable($MIB_IF_TYPE_ETHERNET_CSMACD, $Dll)

If Not @error Then
    For $i = 1 To $Data[0][0]
        $Adapter[0][0] += 1
        ReDim $Adapter[$Adapter[0][0] + 1][3]
        $Adapter[$Adapter[0][0]][0] = $Data[$i][1 ] ; Interface index
        $Adapter[$Adapter[0][0]][2] = $Data[$i][19] ; Description
    Next
EndIf

GUICtrlCreateGroup("Интернет-Адаптеры", 16, 288, 585, 97)
GUICtrlCreateLabel("Адаптер:", 32, 309, 49, 17)
$Combo = GUICtrlCreateCombo("", 88, 307,505, 25,  $CBS_DROPDOWNLIST)
GUICtrlSetOnEvent($Combo, "_MainGUI_Events")

If $Adapter[0][0] Then
    For $i = 1 To $Adapter[0][0]
        _GUICtrlComboBox_AddString($Combo, $Adapter[$i][2])
    Next
    $Index = 1
Else
    _GUICtrlComboBox_AddString($Combo, 'None')
    GUICtrlSetState(-1, $GUI_DISABLE)
EndIf

_GUICtrlComboBox_SetCurSel($Combo, 0)
GUICtrlCreateGroup("Трансфер (Bytes + MB):", 24, 333, 569, 44)
GUICtrlCreateLabel("Отдача:", 34, 354, 43, 17)
$Label41 = GUICtrlCreateInput("", 87, 353, 81, 17, BitOR($ES_RIGHT, $ES_READONLY))
GUICtrlCreateInput("", 184, 353, 81, 17, BitOR($ES_RIGHT, $ES_READONLY))
GUICtrlCreateLabel("Прием:", 346, 354, 43, 17)
$Label42 = GUICtrlCreateInput("", 399, 353, 85, 17, BitOR($ES_RIGHT, $ES_READONLY))
GUICtrlCreateInput("", 496, 353, 81, 17, BitOR($ES_RIGHT, $ES_READONLY))

GUICtrlCreateTabItem("")

;;;; Common Buttons ;;;;
$nSettings_Button = GUICtrlCreateButton("Опции", 500, 7, 105, 25)
$nExit_Button = GUICtrlCreateButton("Выход", 535, 400, 70, 33)
GUICtrlSetOnEvent($nExit_Button, "_MainGUI_Events")
GUICtrlSetOnEvent($nSettings_Button, "_MainGUI_Events")
GUISetOnEvent($GUI_EVENT_CLOSE, "_MainGUI_Events", $hMain_GUI)

_Combo()
AdlibRegister("_Combo", 1000)
GUISetState(@SW_SHOW, $hMain_GUI)

While 1
    Sleep(100)
WEnd

Func CLOSEClicked()
        Exit
EndFunc

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;      FUNCTIONS            ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Func _MainGUI_Events()
        Switch @GUI_CtrlId
        Case $GUI_EVENT_CLOSE, $nExit_Button
            Exit
        Case $nSettings_Button
            _Settings_GUI($hMain_GUI)
                case $Combo
                        $Index = _GUICtrlComboBox_GetCurSel($Combo) + 1
        EndSwitch
EndFunc

Func _Settings_GUI($hMain_GUI)
    Local $iOpt_GOEM, $hSettings_GUI, $nStngs_Close_Button, $nStngs_Save_Button

    $iOpt_GOEM = Opt("GUIOnEventMode", 0)

    $hSettings_GUI = GUICreate("Настройки", 400, 250, -1, -1, -1, -1, $hMain_GUI)
    $nStngs_Close_Button = GUICtrlCreateButton("Выход", 20, 220, 60, 20)
    $nStngs_Save_Button = GUICtrlCreateButton("Сохранить", 90, 220, 60, 20)

    GUISetState(@SW_DISABLE, $hMain_GUI)
    GUISetState(@SW_SHOW, $hSettings_GUI)

    While 1
          Switch GUIGetMsg()
            Case $GUI_EVENT_CLOSE, $nStngs_Close_Button
                ExitLoop
            Case $nStngs_Save_Button
                MsgBox(64, 'Сохранение настроек', 'Изменения сохранены!', 0, $hSettings_GUI)
                        EndSwitch
    WEnd

    GUISetState(@SW_ENABLE, $hMain_GUI)
    GUISetState(@SW_HIDE, $hSettings_GUI)

    Opt("GUIOnEventMode", $iOpt_GOEM)
EndFunc

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;          SECTIONS      ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


;; Network Section ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

;; определение текущего АДАПТЕРА и его sent/receive
Func _Combo()
    If $Index Then
        $Data = _WinAPI_GetIfEntry($Adapter[$Index][0], $Dll)
       
                If Not @error Then
            GUICtrlSetData($Label41, _Str($Data[14]) & ' bytes')
            GUICtrlSetData($Label42, _Str($Data[8 ]) & ' bytes')
            GUICtrlSetData($Label41 + 1, StringFormat('%.2f', $Data[14] / 1024 / 1024) & ' MB')
            GUICtrlSetData($Label42 + 1, StringFormat('%.2f', $Data[8 ] / 1024 / 1024) & ' MB')
        Else
            GUICtrlSetData($Label41, '')
            GUICtrlSetData($Label42, '')
        EndIf
    EndIf
EndFunc

Func _Str($iValue)
    Local $Result = '', $Str = String($iValue)
    While StringLen($Str)
        $Result = '.' & StringRight($Str, 3) & $Result
        $Str = StringTrimRight($Str, 3)
    WEnd
    Return StringTrimLeft($Result, 1)
EndFunc  ;==>_Str

Func _WinAPI_GetIfEntry($iIndex, $Dll = -1)
    Local $Ret, $Data, $Addr, $Count
    Local $tMIB_IFROW

    If $Dll < 0 Then
        $Dll = 'IPHlpApi.dll'
    EndIf

    $tMIB_IFROW = DllStructCreate($tagMIB_IFROW)
    DllStructSetData($tMIB_IFROW, 2, $iIndex)
    $Ret = DLLCall($Dll, 'dword', 'GetIfEntry', 'ptr', DllStructGetPtr($tMIB_IFROW))
    If @error Then
        Return SetError(1, 0, 0)
    EndIf
    Dim $Data[20]
    $Data[0 ] = DllStructGetData($tMIB_IFROW, 'Name')
    $Data[1 ] = $iIndex
    $Data[2 ] = DllStructGetData($tMIB_IFROW, 'Type')
    $Data[3 ] = DllStructGetData($tMIB_IFROW, 'Mtu')
    $Data[4 ] = DllStructGetData($tMIB_IFROW, 'Speed')
    $Count = DllStructGetData($tMIB_IFROW, 'PhysAddrLen')
    $Addr = ''
    For $i = 1 To $Count
        $Addr &= Hex(DllStructGetData($tMIB_IFROW, 'PhysAddr', $i), 2) & '-'
    Next
    $Data[5 ] = StringTrimRight($Addr, 1)
    $Data[6 ] = DllStructGetData($tMIB_IFROW, 'AdminStatus')
    $Data[7 ] = DllStructGetData($tMIB_IFROW, 'OperStatus')
    $Data[8 ] = DllStructGetData($tMIB_IFROW, 'InOctets')
    $Data[9 ] = DllStructGetData($tMIB_IFROW, 'InUcastPkts')
    $Data[10] = DllStructGetData($tMIB_IFROW, 'InNUcastPkts')
    $Data[11] = DllStructGetData($tMIB_IFROW, 'InDiscards')
    $Data[12] = DllStructGetData($tMIB_IFROW, 'InErrors')
    $Data[13] = DllStructGetData($tMIB_IFROW, 'InUnknownProtos')
    $Data[14] = DllStructGetData($tMIB_IFROW, 'OutOctets')
    $Data[15] = DllStructGetData($tMIB_IFROW, 'OutUcastPkts')
    $Data[16] = DllStructGetData($tMIB_IFROW, 'OutNUcastPkts')
    $Data[17] = DllStructGetData($tMIB_IFROW, 'OutDiscards')
    $Data[18] = DllStructGetData($tMIB_IFROW, 'OutErrors')
    $Data[19] = StringLeft(DllStructGetData($tMIB_IFROW, 'Descr'), DllStructGetData($tMIB_IFROW, 'DescrLen') - 1)
    Return $Data
EndFunc  ;==>_WinAPI_GetIfEntry

Func _WinAPI_GetIfTable($iType = 0, $Dll = -1)
    Local $Ret, $Row, $Type, $Tag, $Tab, $Addr, $Count, $Lenght
    Local $tMIB_IFTABLE, $tMIB_IFROW

    If $Dll < 0 Then
        $Dll = 'IPHlpApi.dll'
    EndIf

    $tMIB_IFROW = DllStructCreate($tagMIB_IFROW)
    $Row = 'byte[' & DllStructGetSize($tMIB_IFROW) & ']'
    $Tag = 'dword;'
    For $i = 1 To 32
        $Tag &= $Row & ';'
    Next
    $tMIB_IFTABLE = DllStructCreate($Tag)
    $Ret = DLLCall($Dll, 'dword', 'GetIfTable', 'ptr', DllStructGetPtr($tMIB_IFTABLE), 'long*', DllStructGetSize($tMIB_IFTABLE), 'int', 1)
    If @error Then
        Return SetError(1, 0, 0)
    EndIf
    $Count = DllStructGetData($tMIB_IFTABLE, 1)
    Dim $Tab[$Count + 1][20]
    $Tab[0][0] = 0
    For $i = 1 To $Count
        $tMIB_IFROW = DllStructCreate($tagMIB_IFROW, DllStructGetPtr($tMIB_IFTABLE, $i + 1))
        $Type = DllStructGetData($tMIB_IFROW, 'Type')
        If ($iType = 0) Or ($iType = $Type) Then
            $Tab[0][0] += 1
            $Tab[$Tab[0][0]][0 ] = DllStructGetData($tMIB_IFROW, 'Name')
            $Tab[$Tab[0][0]][1 ] = DllStructGetData($tMIB_IFROW, 'Index')
            $Tab[$Tab[0][0]][2 ] = $Type
            $Tab[$Tab[0][0]][3 ] = DllStructGetData($tMIB_IFROW, 'Mtu')
            $Tab[$Tab[0][0]][4 ] = DllStructGetData($tMIB_IFROW, 'Speed')
            $Lenght = DllStructGetData($tMIB_IFROW, 'PhysAddrLen')
            $Addr = ''
            For $j = 1 To $Lenght
                $Addr &= Hex(DllStructGetData($tMIB_IFROW, 'PhysAddr', $j), 2) & '-'
            Next
            $Tab[$Tab[0][0]][5 ] = StringTrimRight($Addr, 1)
            $Tab[$Tab[0][0]][6 ] = DllStructGetData($tMIB_IFROW, 'AdminStatus')
            $Tab[$Tab[0][0]][7 ] = DllStructGetData($tMIB_IFROW, 'OperStatus')
            $Tab[$Tab[0][0]][8 ] = DllStructGetData($tMIB_IFROW, 'InOctets')
            $Tab[$Tab[0][0]][9 ] = DllStructGetData($tMIB_IFROW, 'InUcastPkts')
            $Tab[$Tab[0][0]][10] = DllStructGetData($tMIB_IFROW, 'InNUcastPkts')
            $Tab[$Tab[0][0]][11] = DllStructGetData($tMIB_IFROW, 'InDiscards')
            $Tab[$Tab[0][0]][12] = DllStructGetData($tMIB_IFROW, 'InErrors')
            $Tab[$Tab[0][0]][13] = DllStructGetData($tMIB_IFROW, 'InUnknownProtos')
            $Tab[$Tab[0][0]][14] = DllStructGetData($tMIB_IFROW, 'OutOctets')
            $Tab[$Tab[0][0]][15] = DllStructGetData($tMIB_IFROW, 'OutUcastPkts')
            $Tab[$Tab[0][0]][16] = DllStructGetData($tMIB_IFROW, 'OutNUcastPkts')
            $Tab[$Tab[0][0]][17] = DllStructGetData($tMIB_IFROW, 'OutDiscards')
            $Tab[$Tab[0][0]][18] = DllStructGetData($tMIB_IFROW, 'OutErrors')
            $Tab[$Tab[0][0]][19] = StringLeft(DllStructGetData($tMIB_IFROW, 'Descr'), DllStructGetData($tMIB_IFROW, 'DescrLen') - 1)
        EndIf
    Next
    If $Tab[0][0] < $Count Then
        ReDim $Tab[$Tab[0][0] + 1][20]
    EndIf
    Return $Tab
EndFunc  ;==>_WinAPI_GetIfTable

;; конец определение текущего адаптера и его sent/receive

;; End Network  Section  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


saavaage 24-08-2010 13:08 1480694

Creat0R, cпасибо большое. Тема закрыта

Creat0R 25-08-2010 02:15 1481111

Цитата:

Цитата saavaage
Тема закрыта »

Она не закрыта, а решена ;)


Время: 01:44.

Время: 01:44.
© OSzone.net 2001-