1 Local System Monitor “Мониторинг работы учащихся в локальной сети” Среда программирования: Microsoft Visual Basic 6 Выполнил: Левин Иван, ГБОУ лицей 1550, 11 класс Руководители: Воробьева В.В., Дружерукова Л.В. Москва 2013 2 Оглавление Описание ........................................................................................................................................3 Интерфейс сервера и основные функции ....................................................................................4 1. Информация ........................................................................................................................4 2. Процессы .............................................................................................................................5 3. Питание................................................................................................................................6 4. Монитор...............................................................................................................................6 5. Сообщение...........................................................................................................................7 6. Удаленный доступ ..............................................................................................................7 7. Режим отладки ....................................................................................................................8 Интерфейс клиента и основные функции ...................................................................................9 1. Основная форма ..................................................................................................................9 2. Форма сообщения .............................................................................................................10 Пример исходного кода программы клиента ...........................................................................11 1. Используемые функции и модули. Декларации. ...........................................................11 2. Запуск программы ............................................................................................................13 3. Отправка и прием данных ...............................................................................................14 4. Питание..............................................................................................................................14 5. Монитор.............................................................................................................................15 6. Сообщение.........................................................................................................................17 7. Видео..................................................................................................................................18 Пример исходного кода программы сервера ............................................................................20 1. Используемые функции и модули. Декларации. ...........................................................20 2. Запуск программы ............................................................................................................20 3. Отправка и прием данных ...............................................................................................21 4. Лог ......................................................................................................................................22 5. Видео..................................................................................................................................22 3 Описание Данный проект содержит 2 программы: сервер и клиент. Они предназначены для мониторинга и управления другими компьютерами в локальной сети или сети Интернет. В первую очередь проект полезен в школах, в кабинетах информатики, где ученики взаимодействуют с компьютером и могут не следовать указаниям учителя. Для начала работы необходимо установить программу-клиент LSM Client на компьютер ученика и сервер LSM Server на компьютер учителя. Узнать IP адрес компьютера учителя (это можно сделать, открыв в сервере лог) и вписать его в текстовый файл prop.txt. Запустить программу-клиент. Она автоматически добавит себя в автозагрузку, и теперь не будет нуждаться в повторном запуске. Для работы программ необходимы библиотеки, которые содержатся в папке с дистрибутивом. Их следует оставить в одном каталоге с исполняемым файлом. Примечательная функция клиента заключается в том, что, после отправки команды сервером, он становится полностью автономным и может выполнять поставленную задачу без подключения. 4 Интерфейс сервера и основные функции При подключении клиентов, их данные добавляются в список. На данный момент доступно максимально 50 подключений одновременно, однако количество подключений в скором времени будет изменяемым. 1. Информация Данная форма предоставляет основную информацию о клиенте: имя компьютера имя пользователя IP-адрес в локальной сети специальное имя, присвоенное каждому компьютера в отдельности. 5 2. Процессы При нажатии на кнопку «Процессы» открывается форма с процессами клиента и автоматически обновляется список запущенных программ. Здесь можно завершить выделенный процесс и выполнить новую задачу аналогично диспетчеру задач Windows. 6 3. Питание Данная функция позволяет управлять питанием устройствами учеников: выключать, перезагружать, отправлять в гибернацию, и выходить из системы. Время выключения можно изменять. Кнопка открытия формы одновременно является строкой состояния. 4. Монитор При необходимости остановить работу компьютеров, но не отключать их, можно воспользоваться функцией выключения и включения монитора. Для этого нужно установить время, через которое монитор выключится, и время, через которое он снова включится. 7 5. Сообщение При сообщить желании что-то клиенту (если, например, учитель видит, что ученик занимается не тем, чем надо) можно сообщение. 6. Удаленный доступ отправить 8 На данный момент является основной функцией. Для видео открывается отдельное окно, где можно выбрать клиента и тип видео (экран или веб-камера). При нажатии на кнопку «Старт» начинается видеотрансляция с выбранного экрана. Программа позволяет сохранять фрагменты видео в изображения в формате .jpg. Стоит нажать кнопку «Сохранить список», как сразу создается папка “ScreenShots”, и в неё добавляются изображения. Для активации удаленного доступа необходимо нажать на соответствующую кнопку. Если кнопка вдавлена, то доступ функция активирована. В данном режиме передаются положения курсора мыши и клавиш. 7. Режим отладки Верхние меню позволяет включить режим отладки. В этом режиме активируется лог – история использования. В логе записываются все использованные команды, а также отчеты об ошибках. Все это записывается в файл log.txt Функции «Свернуть в трей», «Настройки», «Передача файла», и «Файловая система» находятся в разработке. 9 Интерфейс клиента и основные функции При запуске программы клиента считывается файл её настройки prop.txt. Программа автоматически распаковывает необходимые библиотеки и ActiveX элементы, необходимые для работы, в директорию с исполняемым файлом. Ip – массив IP-адресов, к которым может присоединиться клиент. Mainport – основной порт подключения. Specname – специальное имя, задается сервером. Autorun – добавление программы в автозагрузку. Devices – количество устройств в сети. 1. Основная форма Данная форма предназначена исключительно для разработки. В ней можно найти основную информацию о происходящем: статус подключения, время включения и отключения компьютера и монитора, список процессов и скриншот экрана, который в следствии будет переслан серверу. Видимость этого окна определяется свойством hide в файле. 10 2. Форма сообщения Программа сервера позволяет отправлять сообщения. В свойствах этой функции можно выбрать размер окна сообщения: «На весь экран» или не на весь. Первая опция разворачивает окно во весь экран и блокирует клавиатуру и мышь. Вторая же активирует маленькое окошко с возможностью его закрытия и ответа учителю. Внизу располагается таймер, показывающий время, через которое окно закроется автоматически. Также есть форма ответа серверу, однако эта функция пока находится в разработке. 11 Пример исходного кода программы клиента 1. Используемые функции и модули. Декларации. ‘WIN API для основных функций программы Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long Public Declare Function SetFocus Lib "user32" (ByVal hwnd As Long) As Long Public Declare Function BlockInput Lib "user32" (ByVal fBlock As Long) As Long Public Declare Function GetDestktopWindow Lib "user32" () As Long Public Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long Public Declare Function BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal x As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long Private Declare Function CreateRoundRectRgn Lib "gdi32" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long, ByVal X3 As Long, ByVal Y3 As Long) As Long Private Declare Function SetWindowRgn Lib "user32" (ByVal hwnd As Long, ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long Private Declare Function SetCursorPos Lib "user32" (ByVal x As Long, ByVal y As Long) As Long Private Declare Function ShowCursor Lib "user32" (ByVal bShow As Long) As Long Public Const TH32CS_SNAPPROCESS As Long = 2& Public Const MAX_PATH As Integer = 260 Public Type ProcessEntry dwSize As Long cntUsage As Long th32ProcessID As Long th32DefaultHeapID As Long th32ModuleID As Long cntThreads As Long th32ParentProcessID As Long pcPriClassBase As Long dwFlags As Long szExeFile As String * MAX_PATH End Type Public Declare Function CreateToolhelpSnapshot Lib "Kernel32" Alias "CreateToolhelp32Snapshot" (ByVal lFlags As Long, ByVal lProcessID As Long) As Long Public Declare Function ProcessFirst Lib "Kernel32" Alias "Process32First" (ByVal hSnapShot As Long, uProcess As ProcessEntry) As Long Public Declare Function ProcessNext Lib "Kernel32" Alias "Process32Next" (ByVal hSnapShot As Long, uProcess As ProcessEntry) As Long Public Declare Sub CloseHandle Lib "Kernel32" (ByVal hPass As Long) 12 Public split_tag As String Public ProcMsg As String Public MsgFulled As Boolean ‘Разделитель Public ConnectionIP As String ‘Переменные, считываемые из файла Public HideProgramm As Boolean Public SpecialName As String Public MainPort As Integer Public VideoPort As Integer Public AddToAutorun As Boolean Public Sub addautorun() ‘Функция добавления в автозагрузку On Error Resume Next Set Reg = CreateObject("WScript.Shell") Reg.RegWrite "HKLM\Software\Microsoft\Windows\CurrentVersion\Run\" & App.EXEName & ".exe", App.Path & "\" & App.EXEName & ".exe" Set Reg = Nothing End Sub Public Sub GetProcessList() ‘Функция для просмотра процессов On Error Resume Next ProcMsg = "" Mainform.ListOfProcesses.Clear Dim hSnapShot As Long Dim uProcess As ProcessEntry Dim r As Long hSnapShot = CreateToolhelpSnapshot(TH32CS_SNAPPROCESS, 0&) If hSnapShot = 0 Then Exit Sub uProcess.dwSize = Len(uProcess) r = ProcessFirst(hSnapShot, uProcess) Do While r Mainform.txt_proc.Text = uProcess.szExeFile Proc = Mainform.txt_proc.Text & " / " & uProcess.th32ProcessID ' & " / " Mainform.ListOfProcesses.AddItem Proc r = ProcessNext(hSnapShot, uProcess) ProcMsg = ProcMsg & Proc & split_tag Loop Call CloseHandle(hSnapShot) Mainform.wsk_send "processes" & split_tag & ProcMsg End Sub Public Function ReadMainFile() ‘Функция считывания из файла On Error Resume Next Dim InLine As String Dim LA() As String Open App.Path & "\prop.txt" For Input As #1 While EOF(1) = False DoEvents Line Input #1, InLine LA = Split(InLine, "=") 13 Select Case LA(0) Case "ip" ConnectionIP = LA(1) Case "hide" HideProgramm = LA(1) Case "mainport" MainPort = LA(1) Case "videoport" VideoPort = LA(1) Case "specname" SpecialName = LA(1) Case "autorun" AddToAutorun = LA(1) End Select Wend Close #1 End Function 2. Запуск программы Private Sub Form_Load() split_tag = " -('V')- " ReadMainFile If AddToAutorun = True Then addautorun If App.PrevInstance = True Then End If HideProgramm = True Then Me.Hide wsk.RemoteHost = ConnectionIP wsk.RemotePort = MainPort wsk_video.LocalPort = VideoPort wsk_video.Listen tmr_connect.Enabled = True ‘Разделитель ‘Считывание из файла ‘Добавление в автозагрузку ‘Завершает приложение, если уже запущено ‘Winsock – ActiveX для соединения по сети ‘Таймер присоединения ComputerName = Environ("computername") UserName = Environ("username") InfoAboutComputer = "info" & split_tag & ComputerName & split_tag & UserName & split_tag & SpecialName pic.Width = Screen.Width ‘PictureBox для скриншота pic.Height = Screen.Height pic.AutoRedraw = 1 End Sub Private Sub tmr_connect_Timer() ‘Таймер присоединения If wsk.State <> 6 And wsk.State <> 7 Then wsk.Close wsk.Connect tmr_senddata.Enabled = True ‘Таймер отправки данных Text1.Text = Val(Text1.Text) + 1 'для проверки таймера 14 End If If wsk_video.State <> 6 And wsk_video.State <> 7 Then wsk_video.Close wsk_video.Listen End If End Sub Private Sub tmr_senddata_Timer() If wsk.State = 7 Then wsk_send InfoAboutComputer txt_senddata = InfoAboutComputer tmr_senddata.Enabled = False End If End Sub ‘Таймер отправки данных 3. Отправка и прием данных Public Function wskV_send(wsk_message As String) On Error GoTo err2 wsk_video.SendData wsk_message txt_senddata.Text = wsk_message Exit Function err2: txt_senddata.Text = "Error(" & Err.Number & ") sending: " & wsk_message Resume Next End Function Private Sub wsk_DataArrival(ByVal bytesTotal As Long) On Error Resume Next Dim data() As String Dim IncomeData As String wsk.GetData IncomeData txt_senddata.Text = IncomeData data = Split(IncomeData, split_tag) If data(0) = "shell" Then Shell data(1), vbHide: GetProcessList_Click If data(0) = "needproc" Then Call GetProcessList If data(0) = "power" Then Call power(data(1), data(2), data(3)) If data(0) = "monitor" Then Call monitor(data(1), data(2), data(3)) If data(0) = "msg" Then Call message(data(1), data(2), data(4), data(5), data(3)) End Sub 4. Питание Private Sub power(action As String, time As String, time_for As String) If action = "cancel" Then tmr_power.Enabled = False Shell ("shutdown -a") wsk_send "power_state" & split_tag & "Питание" Else time_remaining = Val(time) time_for = Val(time_for) 15 Wpower.time_remaining = time_remaining Wpower.time_for = time_for Wpower.action = action If Wpower.action = "shutdown" Then Wpower.action_title = "Выключение" If Wpower.action = "reboot" Then Wpower.action_title = "Перезагрузка" If Wpower.action = "sleep" Then Wpower.action_title = "Сон" If Wpower.action = "hibernate" Then Wpower.action_title = "Гибернация" If Wpower.action = "block" Then Wpower.action_title = "Блокировать" If Wpower.action = "changeuser" Then Wpower.action_title = "Смена пользователя" If Wpower.action = "logout" Then Wpower.action_title = "Выход из системы" tmr_power.Enabled = True ‘Таймер времени отключения If Wpower.action = "cancel" Then Wpower.action_title = "Питание": Shell ("shutdown -a"): txt_power.Text = Wpower.action_title: tmr_power.Enabled = False End If End Sub Private Sub tmr_power_Timer() ‘Таймер времени отключения On Error Resume Next msg = Wpower.action_title & " через " & Wpower.time_remaining & " секунд..." txt_power.Text = msg If Wpower.time_remaining <= 0 Then msg = Wpower.action_title & "..." wsk_send "power_state" & split_tag & msg If Wpower.time_remaining <= 0 Then tmr_power.Enabled = False Sshutdown Wpower.action, Val(Wpower.time_for) ‘Функция отключения End If Wpower.time_remaining = Wpower.time_remaining - 1 End Sub Private Sub Sshutdown(action As String, time_for As Integer) Dim cmdchar As String Select Case action Case "shutdown" cmdchar = "s" Case "reboot" cmdchar = "r" Case "hibernate" cmdchar = "h" Case "logout" cmdchar = "l" End Select Call Shell ("shutdown -" & cmdchar & " -f -t " & time_for) End Sub ‘Функция отключения 5. Монитор Private Sub monitor(action As String, time As String, time_for As String) Wmonitor.action = action Wmonitor.time = Val(time) Wmonitor.time_for = Val(time_for) Wmonitor.time_for_start = Wmonitor.time_for 16 tmr_monitor_time.Enabled = True End Sub Private Sub tmr_monitor_time_for_Timer() Wmonitor.time_for = Wmonitor.time_for - 1 If Wmonitor.time_for > 0 Then msg = "Монитор выключен еще " & Wmonitor.time_for & " секунд..." Else tmr_monitor_time_for.Enabled = False tmr_monitor_off.Enabled = False SendMessage Me.hwnd, &H112, &HF170&, ByVal -1& msg = "Монитор" End If txt_monitor.Text = msg wsk_send "monitor_state" & split_tag & msg End Sub Private Sub tmr_monitor_time_Timer() On Error Resume Next If Wmonitor.time > 0 Then Wmonitor.time = Wmonitor.time - 1 If Wmonitor.action = "off" Then msg = "Выключить монитор через " & Wmonitor.time & " секунд..." Else msg = "Включить монитор через " & Wmonitor.time & " секунд..." End If Else If Wmonitor.action = "off" Then If Wmonitor.time_for_start = 0 Then tmr_monitor_off.Enabled = True tmr_monitor_time.Enabled = False tmr_monitor_time_for.Enabled = False msg = "Монитор выключен" Else tmr_monitor_time_for.Enabled = True tmr_monitor_time.Enabled = False tmr_monitor_off.Enabled = True End If Else tmr_monitor_off.Enabled = False tmr_monitor_time.Enabled = False tmr_monitor_time_for.Enabled = False msg = "Монитор" SendMessage Me.hwnd, &H112, &HF170&, ByVal -1& End If End If wsk_send "monitor_state" & split_tag & msg txt_monitor.Text = msg End Sub Private Sub tmr_monitor_off_Timer() SendMessage Me.hwnd, &H112, &HF170&, ByVal 2& End Sub 17 6. Сообщение Public Sub message(action As String, size As String, title As String, msg As String, msgtime As String, Optional userclose As Boolean) Unload frm_msg If action = "send" Then If size = "full" Then MsgFulled = True Else MsgFulled = False frm_msg.Show frm_msg.lbl_msg = msg frm_msg.lbl_title = title wMsg.time_remaining = msgtime wMsg.time_for_start = msgtime If wMsg.time_for_start <> 0 Then tmr_msg.Enabled = True Else tmr_msg.Enabled = False frm_msg.lbl_time = "" wsk_send "msg_state" & split_tag & "Сообщение открыто" & split_tag & " " & split_tag End If Else tmr_msg.Enabled = False If userclose = True Then wsk_send "msg_state" & split_tag & "Сообщение" & split_tag & "UserMsgClosed" & split_tag Else wsk_send "msg_state" & split_tag & "Сообщение" & split_tag & " " & split_tag End If BlockInput False End If End Sub Private Sub Form_Load() ‘Форма сообщения Me.Left = Screen.Width / 2 - Me.Width / 2 Me.Top = Screen.Height / 2 - Me.Height / 2 If MsgFulled = False Then Rgn = CreateRoundRectRgn(0, 0, Me.Width / Screen.TwipsPerPixelX, Me.Height / Screen.TwipsPerPixelY, 25, 25) SetWindowRgn hwnd, Rgn, True ‘Закругленные края у формы cmd_ok.Visible = True ‘Кнопка закрытия сообщений cmd_send.Visible = True ‘Кнопка ответа сервера lbl_time.Top = Me.Height - 400 lbl_time.Left = Me.Width - 400 h = 700 Else tmr_active.Enabled = True ‘Таймер блокировки cmd_ok.Visible = False cmd_send.Visible = False SetWindowPos Me.hwnd, -1, 0, 0, Me.ScaleWidth, Me.ScaleHeight, 0 ‘Во весь экран Me.Width = Screen.Width Me.Height = Screen.Width h = 1000 18 lbl_time.Top = Screen.Height - 400 lbl_time.Left = Screen.Width - 400 End If lbl_title.Left = Me.Width / 2 - lbl_title.Width / 2 lbl_msg.Left = Me.Width / 2 - lbl_msg.Width / 2 lbl_msg.Top = Me.Height - lbl_msg.Height - h lbl_power.Left = lbl_msg.Left lbl_monitor.Left = lbl_msg.Left + lbl_msg.Width - lbl_monitor.Width lbl_power.Top = lbl_msg.Top - 500 lbl_monitor.Top = lbl_msg.Top - 500 End Sub Private Sub Form_Unload(Cancel As Integer) tmr_active.Enabled = False MsgFulled = False End Sub ‘Выгрузка формы Private Sub tmr_msg_Timer() frm_msg.lbl_time.Caption = wMsg.time_remaining lbl_msg.Caption = wMsg.time_remaining If wMsg.time_remaining <= 0 Then tmr_msg.Enabled = False wsk_send "msg_state" & split_tag & "Сообщение" & split_tag & " " & split_tag Unload frm_msg Call message("cancel", "not full", "", "", "") BlockInput False ‘Разблокировка мыши и клавиатуры End If wsk_send "msg_state" & split_tag & "Сообщение открыто еще " & wMsg.time_remaining & " секунд" & " " & split_tag wMsg.time_remaining = wMsg.time_remaining - 1 End Sub Private Sub tmr_active_Timer() If MsgFulled = True Then X1 = Screen.Width / Screen.TwipsPerPixelX / 2 Y1 = Screen.Height / Screen.TwipsPerPixelY / 2 SetCursorPos X1, Y1 BlockInput True ‘Блокировка клавиатуры и мыши SetWindowPos Me.hwnd, -1, 0, 0, Me.ScaleWidth, Me.ScaleHeight, 0 Else End If End Sub 7. Видео Private Sub wsk_video_DataArrival(ByVal bytesTotal As Long) On Error Resume Next Dim data() As String Dim IncomeData As String Dim blablabla As String wsk_video.GetData IncomeData txt_senddata.Text = IncomeData data = Split(IncomeData, split_tag) 19 If data(0) = "start" Then Close #7 MkDir "temp" If data(1) = "Screen" Then Call BitBlt(pic.hDC, 0, 0, ScaleWidth, ScaleHeight, GetDC(hwndSrc), 0, 0, &HCC0020) SavePicture pic.Image, "temp\temp.jpg", 0 End If ScreenShotReadStatus = 0 FileSize = FileLen("temp\temp.jpg") PaketSize = 8000 paket = String(PaketSize, vbNullChar) txt_openedJPG.Text = "" Open "temp\temp.jpg" For Binary As #7 wskV_send "start" Else If data(0) = "next" Then If FileSize <= ScreenShotReadStatus Then wskV_send "stop" Close #7 Else If FileSize - ScreenShotReadStatus < PaketSize Then PaketSize = FileSize - ScreenShotReadStatus paket = String(PaketSize, vbNullChar) End If Get #7, , paket wskV_send paket ScreenShotReadStatus = ScreenShotReadStatus + PaketSize lbl_filelen.Caption = ScreenShotReadStatus & "/" & FileSize End If End If End If End Sub 20 Пример исходного кода программы сервера 1. Используемые функции и модули. Декларации. Public InfoFormFocus As Boolean ‘Переменные для определения активности окна Public ProcessFormFocus As Boolean Public PowerFormFocus As Boolean Public MonitorFormFocus As Boolean Public FileFormFocus As Boolean Public MsgFormFocus As Boolean Public VideoFormFocus As Boolean Public SendFileFormFocus As Boolean Public Type tUser Ip As String ComputerName As String UserName As String Power As String Monitor As String MsgState As String log_action As String SpecialName As String End Type Public logVisible As Boolean Public split_tag As String Public SendStatus As Boolean Const NMBOfWsk = 50 Public User(NMBOfWsk) As tUser Public SelectedUser As Integer Public VideoPort As Integer ‘Для определения активности окна лога ‘Разделитель ‘Максимальное кол-во подключений ‘Массив клиентов с большим кол-вом свойств Public Declare Function GetActiveWindow Lib "user32" () As Long 2. Запуск программы Private Sub Form_Load() On Error Resume Next Unload TestForm If App.PrevInstance = True Then End MkDir App.Path & "\temp" split_tag = " -('V')- " wsk(0).LocalPort = 6996 VideoPort = 6997 wsk(0).Listen User(0).Power = power_caption User(0).Monitor = monitor_caption User(0).MsgState = msg_caption 21 User(0).UserName = "Клиент" User(0).Ip = "не выбран" User(0).ComputerName = "" 'Me.hWnd For i = 1 To NMBOfWsk Load wsk(i) Load wsk_video(i) User(i).Power = power_caption User(i).Monitor = monitor_caption User(i).MsgState = msg_caption Next i Load frm_log frm_log.Hide Call LogAdd("_____________________________", False, True) Call LogAdd(" ", False, True) Call LogAdd("Запуск сервера на " & MainForm.wsk(0).LocalIP & ":" & MainForm.wsk(0).LocalPort) End Sub 3. Отправка и прием данных Public Sub sSendData(Senddata As String, Index As Integer, Optional comment1 As String, Optional comment2 As String) On Error GoTo err1 wsk(Index).Senddata Senddata If comment1 <> "" And comment2 <> "" Then LogAdd comment1 & " " & User(Index).UserName & " (" & User(Index).Ip & ") " & comment2 err1: If Err.Number = 40006 Then LogAdd "ERROR 40006", True End If End If Resume Next End Sub Private Sub wsk_DataArrival(Index As Integer, ByVal bytesTotal As Long) On Error Resume Next Dim Data() As String, VData() As String Dim IncomeData As String wsk(Index).GetData IncomeData Data = Split(IncomeData, split_tag) If Data(0) = "processes" Then frm_process.ProcList(0).Clear frm_process.ProcList(1).Clear For i = 1 To UBound(Data) VData = Split(Data(i), " / ") frm_process.ProcList(0).AddItem VData(0) frm_process.ProcList(1).AddItem VData(1) Next i End If 22 If Data(0) = "info" Then User(Index).ComputerName = Data(1) User(Index).UserName = Data(2) User(Index).SpecialName = Data(3) ListOfUsers.AddItem Index & ". " & User(Index).UserName & ": " & User(Index).Ip LogAdd User(Index).UserName & ": " & User(Index).Ip & " подключен" wsk_video(Index).Connect User(Index).Ip, VideoPort End If If Data(0) = "power_state" Then User(Index).Power = Data(1) If Data(0) = "monitor_state" Then User(Index).Monitor = Data(1) If Data(0) = "msg_state" Then User(Index).MsgState = Data(1) If Data(2) = "UserMsgClosed" Then MsgClosed (Index) End If 4. Лог Public Function LogAdd(msg, Optional iferror As Boolean, Optional onlytxt As Boolean) ffile = FreeFile If onlytxt = True Then curdt = msg Else If iferror = False Then addingtext = "[" & Format(Time, "long Time") & "] " & msg Else addingtext = msg End If frm_log.Log.Text = frm_log.Log.Text & addingtext & vbCrLf curdate = Format(Date, "Short Date") curtime = Format(Time, "Long Time") curdt = curdate & " " & curtime & " " & msg End If Open "log.txt" For Append As ffile Print #ffile, curdt Close ffile End Function 5. Видео Public Sub cmd_start_Click() On Error Resume Next If SendStatus = False Then If cmb_video.ListIndex = 0 Then filetype = "Screen" MainForm.sVSenddata "start" & split_tag & filetype, cmb_user.ListIndex cmd_start.Caption = "Стоп" cmb_user.Enabled = 0 cmb_video.Enabled = 0 SendStatus = 1 23 MainForm.LogAdd "Начата видеотрансляция " & User(cmb_user.ListIndex).UserName & " (" & User(cmb_user.ListIndex).Ip & ")" Else MainForm.sVSenddata "stop", cmb_user.ListIndex cmd_start.Caption = "Старт" pic_video.Refresh pic_video.Picture = LoadPicture("") cmb_user.Enabled = 1 cmb_video.Enabled = 1 SendStatus = 0 MainForm.LogAdd "Закончена видеотрансляция " & User(cmb_user.ListIndex).UserName & " (" & User(cmb_user.ListIndex).Ip & ")" End If End Sub Private Sub wsk_video_DataArrival(Index As Integer, ByVal bytesTotal As Long) On Error Resume Next Dim Data() As String Dim IncomeData As String wsk_video(Index).GetData IncomeData Data = Split(IncomeData, split_tag) If Data(0) = "connected" Then frm_video.cmb_user.AddItem Index & ". " & User(Index).UserName & ": " & User(Index).Ip If SendStatus = False Then Exit Sub If Data(0) = "start" Then MkDir temp Close #7 Open "temp/screen.jpg" For Binary As #7 sVSenddata "next" & split_tag, Index Else If Data(0) = "stop" Then Close #7 frm_video.pic_video.Picture = LoadPicture("temp/screen.jpg") sVSenddata "start" & split_tag & "Screen" & split_tag, Index ' cmb_user.ListIndex + 1 Else Put #7, , Data(0) sVSenddata "next" & split_tag, Index End If End If End Sub