Ветеран
Сообщения: 812
Благодарности: 353
|
Профиль
|
Отправить PM
| Цитировать
saavaage,
Я свой и Ваш код поправил давно. Не выкладывал, так как у меня не отображается полная строка с описанием ошибки (обрывается на 300 с чем-то знаков). Искал как убрать это ограничение, вроде в Гугле ссылку нашел на официальный форум, а он висит.
С размножением строк и некоторыми другими косяками разобрался. Как я понял, все функции из GUIListview.au3 работают с Handle Listview, а родные функции работают с ID. При создании ( $ListView = GUICtrlCreateListView()) $ListView это ID, а нужен был Handle.
Предварительно:
читать дальше »
Код: 
#include <Constants.au3>
#include <Encoding.au3>
#include <GUIConstantsEx.au3>
#include <GUIListview.au3>
#include <EditConstants.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
Opt('MustDeclareVars', 1)
Global $hForm1, $hButton1, $hInput, $ListView, $hListView, $aErrorsNew, $nMsg
Dim $aToList = __ErrorLog()
$hForm1 = GUICreate("Form1", 620, 445, -1, -1)
GUIRegisterMsg($WM_NOTIFY, 'WM_NOTIFY')
$hButton1 = GUICtrlCreateButton("Обновить", 16, 120, 65, 57)
$hInput = GUICtrlCreateEdit('', 95, 10, 400, 34, BitOR($ES_READONLY, $ES_MULTILINE))
$ListView = GUICtrlCreateListView('Список событий с ошибками', 95, 60, 400, 320, -1, $LVS_EX_GRIDLINES)
GUICtrlSetState(-1, $GUI_FOCUS)
$hListView = GUICtrlGetHandle($ListView)
_GUICtrlListView_SetColumnWidth($hListView, 0, 2000)
GUICtrlSetTip(-1, "Выделите мышкой строку," & @CRLF & "чтобы получить подсказку.")
If $aToList <> 0 Then
_GUICtrlListView_AddColumn($hListView, '')
For $i = 1 To UBound($aToList) - 1
_GUICtrlListView_AddItem($hListView, $aToList[$i])
Next
_GUICtrlListView_SetItemSelected($hListView, 0)
EndIf
GUISetState(@SW_SHOW)
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $hButton1
GUICtrlSetData($hInput, '')
$aErrorsNew = __ErrorLog()
If $aErrorsNew <> 0 Then
_GUICtrlListView_DeleteAllItems($hListView)
For $i = 1 To UBound($aErrorsNew) - 1
_GUICtrlListView_AddItem($hListView, $aErrorsNew[$i])
Next
_GUICtrlListView_SetItemSelected($hListView, 0)
EndIf
GUICtrlSetState($hButton1, $GUI_ENABLE)
GUICtrlSetState($ListView, $GUI_FOCUS)
EndSwitch
WEnd
Func __ErrorLog()
GUICtrlSetState($hButton1, $GUI_DISABLE)
Local $sLog = '', $j = 0, $hError, $aErrorsTemp, $i
Dim $aErrors[1]
$hError = Run('CSCRIPT.exe ' & @SystemDir & '\eventquery.vbs /v /fi "Type eq ERROR" /fo TABLE /NH', '', @SW_HIDE, $STDOUT_CHILD)
While 1
$sLog &= StdoutRead($hError)
If @error Then ExitLoop
Sleep(10)
WEnd
If Not $sLog Then Return 0
$aErrorsTemp = StringSplit(_Encoding_866To1251($sLog), @LF)
If Not IsArray($aErrorsTemp) Then Return 0
For $i = 1 To $aErrorsTemp[0]
If StringInStr($aErrorsTemp[$i], "ошибка") Then
ReDim $aErrors[UBound($aErrors) + 1]
$j += 1
$aErrors[$j] = StringStripWS(StringStripCR($aErrorsTemp[$i]), 7)
EndIf
Next
$aErrors[0] = UBound($aErrors) - 1
If UBound($aErrors) < 2 Then Return 0
Return $aErrors
EndFunc ;==>__ErrorLog
Func WM_NOTIFY($hWnd, $iMsg, $wParam, $lParam)
Local $tNMITEMACTIVATE = DllStructCreate($tagNMITEMACTIVATE, $lParam)
Local $hFrom = DllStructGetData($tNMITEMACTIVATE, 'hWndFrom')
Local $Index = DllStructGetData($tNMITEMACTIVATE, 'Index')
Local $ID = DllStructGetData($tNMITEMACTIVATE, 'Code')
Switch $hFrom
Case $hListView
Switch $ID
Case $LVN_ITEMCHANGED
If (BitAND(DllStructGetData($tNMITEMACTIVATE, 'Changed'), $LVIF_STATE)) And _
(BitAND(DllStructGetData($tNMITEMACTIVATE, 'NewState'), $LVIS_SELECTED)) _
And (Not BitAND(DllStructGetData($tNMITEMACTIVATE, 'OldState'), $LVIS_FOCUSED)) Then
_ErrorHelp($Index)
EndIf
EndSwitch
EndSwitch
Return $GUI_RUNDEFMSG
EndFunc ;==>WM_NOTIFY
Func _ErrorHelp($Index)
Local $iNumberError, $hHelp, $sLog = ''
GUICtrlSetState($hButton1, $GUI_DISABLE)
GUICtrlSetState($hListView, $GUI_DISABLE)
$iNumberError = StringRegExpReplace(_GUICtrlListView_GetItemText($hListView, $Index), "(?s).*?ошибка (.*?)\s+?.*", '\1')
$hHelp = Run('net helpmsg ' & $iNumberError, '', @SW_HIDE, $STDOUT_CHILD)
While 1
$sLog &= StdoutRead($hHelp)
If @error Then ExitLoop
Sleep(10)
WEnd
$sLog = StringStripWS(StringStripCR(_Encoding_866To1251($sLog)), 7)
GUICtrlSetData($hInput, 'Ошибка № ' & $iNumberError & ' - ' & $sLog)
GUICtrlSetState($hButton1, $GUI_ENABLE)
GUICtrlSetState($hListView, $GUI_ENABLE)
EndFunc ;==>_ErrorHelp
|