Makrut
Новичок
- Сообщения
- 44
- Репутация
- 2
Здравствуйте. Я занимаюсь разработкой программы для своей школы. Есть версия программы на компьютере учителя (она отдает указания) и на компьютерах учеников (выполняет). Появилась необходимость реализации демонстрации экрана одного компьютера ученика. Ниже приведен пример того, как это реализовал я (смеяться строго запрещаю, тк делал "на коленках"). Сейчас программа работает по принципу:
1) Ученик: скриншот сделан-размещен
2) Учитель: скриншот читается и вставляется в форму через цикл while.
Понятное дело, что это не видео, а быстрое слайдшоу, хотелось бы услышать советы, как можно реализовать реальную видео трансляцию (если такое позволяет autoit) или же советы по улучшению имеющейся версии.
Учитель
Ученик
1) Ученик: скриншот сделан-размещен
2) Учитель: скриншот читается и вставляется в форму через цикл while.
Понятное дело, что это не видео, а быстрое слайдшоу, хотелось бы услышать советы, как можно реализовать реальную видео трансляцию (если такое позволяет autoit) или же советы по улучшению имеющейся версии.
Учитель
Код:
Case $Button[0] To $Button[$value - $students_IP[0][0]] ;При нажатии на любую из иконок компьютеров.
;$net - адрес сетевого диска, через который идет чтение и запись
$number = 0
Global $tcp = 1
FileInstall("C:\Users\Константин\Desktop\screen.ini", "Z:\", 1) ;Устанавливаем файл, который будет читать исполнитель.
IniWrite ($net[1][1] & "screen.ini", "screen", "screen", "1" ) ;Хоть файл и заменяется каждый раз при установке, надо подстраховаться (при замене могут возникнуть проблемы).
For $i = 0 to $students_IP[0][0]-1
If $Button[$i] = $nMsg Then $number = $i ;Определяем порядковый номер нажатой кнопки.
Next
SendTCP($students_IP[$number + 1][1],'#3') ;Отправляем сигнал на соответствующий IP.
If $tcp = 0 Then ;Если не удалось подключиться - дальше не идем.
$tcp = 1
Else
Sleep(15)
GUISetState(@SW_HIDE, $form)
$form_pic = GUICreate("Демонстрация экрана " & $students_IP[$number + 1][1], 1280, 1024, 356, 172)
$pic = GUICtrlCreatePic($net[1][1] & "screen1.jpg", -1, -1, 0, 0) ;Устанавливаем уже созданное исполнителем изображение в форму.
GUISetIcon($ico)
GUICtrlSetImage ($form_pic , $ico)
TraySetIcon($ico)
GUISetState(@SW_SHOW, $form_pic)
$while = 1
While $while = 1
GUICtrlSetImage($pic, $net[1][1] & "screen1.jpg") ;Очень часто заменяем скриншот более свежим. На среднем железе может выдавать 15-20 кадров в секунду.
if GUIGetMsg() = $GUI_EVENT_CLOSE Then pic() ;Если приходит оповещение о нажатой кнопке "Крестике", вызываем функцию.
WEnd
EndIf
;=========================================================================================================================
Func pic()
IniWrite ($net[1][1] & "screen.ini", "screen", "screen", "0" ) ;Записываем в установленный файл 0 - исподнитель перестанет делать скриншоты и выйдет из цикла.
GUISetState(@SW_HIDE, $form_pic) ;Скрываем форму.
GUISetState(@SW_SHOW, $form) ;Открываем основную форму.
$while = 0
EndFunc
Ученик
Код:
Case '#3'
$ini_screen = IniReadSection($net[1][1] & "screen.ini", "screen") ;Читаем установленный управляющим файл.
While $ini_screen[1][1] = 1
_screen() ;Выполняем функцию в цикле, при этом всегда проверяем файл на наличие изменений.
$ini_screen = IniReadSection($net[1][1] & "screen.ini", "screen")
WEnd
;============================================================================
Func _screen()
_GDIPlus_Startup () ;Начало.
$bitmap = _ScreenCapture_Capture ("") ;Захват экрана.
_GDIPlus_BitmapCreateFromHBITMAP ($Bitmap) ;Захват экрана.
_GDIPlus_ImageSaveToFile ($image, $net[1][1] & "screen1.jpg") ;сохраняем в рабочий стол.
_GDIPlus_ImageDispose ($Image) ;Очистка ресурсов.
_WinAPI_DeleteObject ($Bitmap) ;Очистка ресурсов.
_GDIPlus_ShutDown () ;Конец.
EndFunc