Что нового

Реализация демонстрации экрана

Makrut

Новичок
Сообщения
44
Репутация
2
Здравствуйте. Я занимаюсь разработкой программы для своей школы. Есть версия программы на компьютере учителя (она отдает указания) и на компьютерах учеников (выполняет). Появилась необходимость реализации демонстрации экрана одного компьютера ученика. Ниже приведен пример того, как это реализовал я (смеяться строго запрещаю, тк делал "на коленках"). Сейчас программа работает по принципу:

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
 
Верх