Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

BORNE MULTIMÉDIA SIMPLISSIME


Information sur la source

Catégorie :VBScript Classé sous : borne, multimédia, powerpoint Niveau : Débutant Date de création : 29/10/2008 Date de mise à jour : 09/02/2009 16:59:48 Vu / téléchargé: 2 617 / 203

Note :
7,33 / 10 - par 3 personnes
7,33 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (24)
Ajouter un commentaire et/ou une note

Description

Cliquez pour voir la capture en taille normale
J'avais besoin pour ma société de mettre en place une borne multimédia dans le hall d'accueil. Le cahier des charge était plutôt réduit :

- diffusion d'une présentation en boucle (style PowerPoint)
- pas d'interactivité (uniquement de l'affichage)
- lancement programmé le matin et arrêt programmé le soir
- mise à jour à distance de la présentation
- programmation de bandeaux défilant translucides en surimpression (v2 seulement)

Des logiciels de gestion de borne multimédia existent dans le commerce mais ils nous ont semblé surdimensionnés par rapport à nos besoins.

La solution (maison) que nous avons décidé de mettre en place s'appuie sur :

- du matériel composé d'un mini-PC sous windows connecté au réseau local, un écran LCD 32 pouces, le tout sur un pied adapté
- PowerPoint comme unique outil de présentation (diaporama en boucle)
- une prise de contrôle à distance de la borne (vnc) pour d'éventuelles opérations de maintenance
- une carte graphique bi-écran. L'écran LCD de la borne est en écran de "droite". L'écran de "gauche" (virtuel) est réservé à la prise de contrôle à distance.
- un script vbscript pour lancer la présentation et scanner périodiquement (toutes les 5 secondes) un dossier de dépôt dans lequel on viendra placer à travers le réseau les mises à jour de cette présentation et un autre pour arrêter la présentation. Ces deux scripts sont lancés automatiquement par le planificateur de tâche Windows.

Lorsqu'un nouveau PowerPoint est trouvé dans le dossier de dépôt, le script interrompt le PowerPoint en cours, déplace le nouveau PowerPoint dans le dossier d'exécution et le lance. Si les deux dossiers sont sur le même volume, l'opération est quasi instantanée.

Le script est également lancé au démarrage du PC pour pouvoir, en cas de coupure de courant, relancer la présentation et le mécanisme de mise à jour.

En principe, la borne est ainsi totalement autonome (pas de clavier ni de souris). la prise de contrôle à distance a été mise en place uniquement pour régler d'éventuels dysfonctionnements.

J'utilise un PowerPoint complet plutôt que la visionneuse PowerPoint afin de pouvoir configurer la présentation sur l'écran de droite. On pourrait aussi utiliser la visionneuse PowerPoint et/ou faire l'impasse sur la prise de contrôle à distance mais dans ce cas, intervention nécessaire sur la borne avec branchement d'un clavier et d'une souris en cas de problème.

La version 1 est la version initialement postée sur Codes-Sources. Elle ne contient pas l'option "bandeaux défilants". Je l'ai conservée dans le zip car elle à le mérite d'être très simple (deux fichiers très courts) pour ceux que l'option n'intéresse pas.

La version 2 permet donc la gestion de bandeaux d'annonce défilants et translucides en surimpression du PowerPoint en cours (sur les conseils de gillardg). Cela utilise des fichiers HTML et un petit visualiseur, exécutable en C#.net dont j'ai joint les sources a toutes fins utiles. Le code VBS a nettement pris de l'embonpoint puisqu'il passe de 68 à 317 lignes.
Le bandeau est un petit fichier HTML. On personnalisera le message en éditant directement le fichier HTML. Les heures de début et de fin d'affichage du bandeau sont également codées dans le fichier HTML derrière des balises meta "Debut" et "Fin". Toutes ces opérations sont très simples, pas besoin de connaitre le HTML pour comprendre comment mettre à jour le bandeau (avec le jeu de fichiers joint) et l'avantage du HTML est que celui-ci est complètement personnalisable.
Une fois le fichier HTML prêt, il suffit, comme pour le Powerpoint, de le déposer dans le dossier de dépôt. Il est possible de programmer à l'avance plusieurs bandeaux, voire même avec chevauchements (dans ce cas, pour une meilleure lisibilité, il vaudra mieux en placer un en bas et l'autre en haut de l'écran...) !

 

Source

  • '
  • ' Démarrage du powerpoint et maj par visite du dossier Depot toutes les 5 sec.
  • ' Gestion des bandeaux
  • '
  • Const repDep="C:\Borne\Depot" ' dossier de dépot
  • Const repExe="C:\Borne\Exec" ' dossier d'exécution
  • Const repArc="C:\Borne\Archives" ' dossier d'archivage des anciens ppt (indiquer une chaine vide si pas d'archivage)
  • Const pptExe="Borne.ppt" ' fichier powerpoint d'exécution
  • Const pptLcd="""C:\Program Files\Microsoft Office 2K3\OFFICE11\POWERPNT.EXE"" /s " ' ligne de commande powerpoint (sans nom de fichier)
  • 'Const pptLcd="""C:\Program Files\Microsoft Office\Office10\POWERPNT.EXE"" /s " ' ligne de commande powerpoint (sans nom de fichier)
  • Const banLcd="C:\Borne\Bandeau.exe " ' ligne de commande de l'afficheur de bandeau
  • Const delai=5000 ' nombre de millisecondes entre chaque itération
  • Dim fso ' objet Scripting.FileSystemObject
  • Dim shl ' objet WScript.Shell
  • Dim ppt ' objet powerpoint
  • Dim htmlNom ' nom des fichiers HTML en cours (tableau)
  • Dim htmlDateFic ' date des fichiers HTML en cours (tableau)
  • Dim htmlDebut ' horaire de début des fichiers HTML en cours (tableau)
  • Dim htmlFin ' horaire de fin des fichiers HTML en cours (tableau)
  • Dim html ' objets HTML en cours (tableau)
  • Dim htmlNb ' nombre de fichiers HTML en cours
  • '--------------------------------------------------------------------------------------------------
  • Dim nom,ext,rep,ficcol,fic,i
  • ' initialisations diverses
  • htmlNb=0
  • Set fso = CreateObject("Scripting.FileSystemObject")
  • Set shl = CreateObject("WScript.Shell")
  • set ppt=nothing
  • ' on considère que le dossier d'exécution doit contenir un Borne.ppt au démarrage
  • If Not fso.FileExists(repExe & "\" & pptExe) Then
  • msgbox "Fichier " & repExe & "\" & pptExe & " innexistant...",vbCritical,"Borne"
  • WScript.Quit
  • End If
  • ' construction des tableaux html* avec les fichiers présents dans le dossier Exec
  • Set rep = fso.GetFolder(repExe)
  • Set ficCol = rep.Files
  • For Each fic in ficCol
  • ext=ucase(fso.GetExtensionName(fic.name))
  • If ext="HTM" or ext="HTML" Then ' on ne s'intéresse qu'aux fichiers HTML
  • nom=fso.GetFileName(fic.name)
  • If fso.FileExists(repDep & "\" & nom) Then
  • ' le fichier est toujours présent dans Depot
  • Call TraiterHtml(nom)
  • Else
  • ' le fichier n'est plus dans Depot -> il a été "déprogrammé" depuis la dernière exécution
  • fic.Delete(True)
  • End If
  • End If
  • Next
  • ' Boucle principale jusqu'à ce que le powerpoint soit interrompu
  • do
  • call Depot
  • WScript.Sleep delai
  • loop while ppt.Status=0
  • ' avant de quitter, interruption des éventuels HTML qui tourneraient encore
  • For i=0 To htmlNb-1
  • If Not html(i) Is Nothing Then
  • ' shl.AppActivate htmlNom(i)
  • ' shl.SendKeys "%{F4}"
  • html(i).Terminate
  • End If
  • Next
  • '--------------------------------------------------------------------------------------------------
  • Sub Depot()
  • '
  • ' rapatriement d'un éventuel powerpoint présent dans le dossier Dépot
  • ' lancement du powerpoint si premier appel ou changement de powerpoint
  • ' traitement des fichiers HTML (bandeau)
  • '
  • dim maj,ind,log,ficbak,dte,n,s
  • ' parcours des fichiers powerpoint du dossier Depot
  • Set rep = fso.GetFolder(repDep)
  • Set ficCol = rep.Files
  • maj = false
  • For Each fic in ficCol
  • ext=ucase(fso.GetExtensionName(fic.name))
  • if ext="PPS" or ext="PPT" then ' on ne s'intéresse qu'aux ppt et pps
  • if maj then
  • ' un powerpoint a déjà été trouvé. Si on en trouve d'autres, on les supprime
  • ' (sinon, ils seraient utilisés 5 secondes plus tard)
  • fic.Delete(True)
  • else
  • ' un powerpoint est trouvé. Si le powerpoint courant est en train de tourner,
  • ' on commence par l'arrêter.
  • if not ppt is nothing then ppt.Terminate
  • ' destruction ou archivage du powerpoint courant
  • if repArc="" then
  • ' pas d'archivage -> destruction du fichier
  • fso.DeleteFile repExe & "\" & pptExe,true
  • else
  • ' archivage du fichier
  • ' récupération de la date du fichier courant
  • set ficbak = fso.GetFile(repExe & "\" & pptExe)
  • dte = ficbak.DateLastModified
  • ' construction d'une chaine de date type "yymmddhhmmss"
  • s = Right(Cstr(Year(dte)),2) & Right(Cstr(Month(dte)+100),2) & Right(Cstr(Day(dte)+100),2) & Right(Cstr(Hour(dte)+100),2) & Right(Cstr(Minute(dte)+100),2) & Right(Cstr(Second(dte)+100),2)
  • ' construction du nom de fichier d'archive (ajout date avant le point)
  • s = Replace(pptExe,".",s & ".")
  • ' déplacement/renommage du fichier dans le dossier d'archive
  • ficbak.Move(repArc & "\" & s)
  • end if
  • ' déplacement du powerpoint déposé dans le dossier d'exécution en le renommant Borne.ppt
  • fic.Move(repExe & "\" & pptExe)
  • ' lancement du nouveau powerpoint (asynchrone)
  • Set ppt = shl.Exec(pptLcd & """" & repExe & "\" & pptExe & """")
  • maj = True
  • end if
  • end if
  • Next
  • if ppt is nothing then
  • ' on est ici si premier appel à Depot() et pas ne nouveau powerpoint dans le dossier Depot
  • ' lancement du powerpoint (asynchrone)
  • Set ppt = shl.Exec(pptLcd & """" & repExe & "\" & pptExe & """")
  • end if
  • ' parcours des fichiers HTML du dossier Depot
  • For Each fic in ficCol
  • ext=ucase(fso.GetExtensionName(fic.name))
  • if ext="HTM" or ext="HTML" then ' on ne s'intéresse qu'aux fichiers HTML
  • nom=fso.GetFileName(fic.name)
  • ind=ArrayGetIndex(htmlNom,nom)
  • If IsNull(ind) Then
  • ' c'est un nouveau fichier
  • fic.Copy(repExe & "\" & nom)
  • Call TraiterHtml(nom)
  • Else
  • ' le fichier est déjà réferencé
  • If htmlDateFic(ind)<>fic.DateLastModified Then
  • ' le fichier a été modifié -> il faut le retraiter
  • If html(ind) Is Nothing Then
  • ' on ne peut le retraiter que s'il n'est pas encore en train de tourner
  • fic.Copy(repExe & "\" & nom)
  • Call TraiterHtml(nom)
  • End If
  • End If
  • End If
  • end if
  • Next
  • ' parcours des HTML en attente
  • ind=0
  • Do While ind<htmlNb
  • If html(ind) Is Nothing Then
  • ' le HTML n'est pas en train de tourner
  • If htmlFin(ind)<=Now Or Not fso.FileExists(repDep & "\" & htmlNom(ind)) Then
  • ' la programmation du fichier appartient au passé
  • ' OU
  • ' le fichier à été supprimé de Depot -> sa programation est annulée
  • ' on supprime le fichier dans les dossier Exec et Depot
  • fso.DeleteFile repExe & "\" & htmlNom(ind),True
  • If fso.FileExists(repDep & "\" & htmlNom(ind)) Then
  • fso.DeleteFile repDep & "\" & htmlNom(ind),True
  • End If
  • ' on supprime les entrées dans les tableaux
  • For i=ind to htmlNb-2
  • htmlNom(i)=htmlNom(i+1)
  • htmlDateFic(i)=htmlDateFic(i+1)
  • htmlDebut(i)=htmlDebut(i+1)
  • htmlFin(i)=htmlFin(i+1)
  • Set html(i)=html(i+1)
  • Next
  • htmlNb=htmlNb-1
  • If htmlNb=0 Then
  • htmlNom=Empty
  • htmlDateFic=Empty
  • htmlDebut=Empty
  • htmlFin=Empty
  • html=Empty
  • Else
  • Redim Preserve htmlNom(htmlNb-1)
  • Redim Preserve htmlDateFic(htmlNb-1)
  • Redim Preserve htmlDebut(htmlNb-1)
  • Redim Preserve htmlFin(htmlNb-1)
  • Redim Preserve html(htmlNb-1)
  • End If
  • ind=ind-1
  • ElseIf htmlDebut(ind)<=Now Then
  • ' il faut le lancer
  • Set html(ind) = shl.Exec(banLcd & """" & repExe & "\" & htmlNom(ind) & """")
  • End If
  • Else
  • ' le html est en train de tourner
  • If htmlFin(ind)<=Now Then
  • ' il faut l'arrêter
  • ' shl.AppActivate htmlNom(ind)
  • ' shl.SendKeys "%{F4}"
  • html(ind).Terminate
  • set html(ind)=Nothing
  • End If
  • End If
  • ind=ind+1
  • Loop
  • ' ecriture du log
  • set log=fso.CreateTextFile(repDep & "\" & "log.txt",true)
  • set fic=fso.GetFile(repExe & "\" & pptExe)
  • log.WriteLine pptExe & " - " & fic.DateLastModified
  • n=0
  • for i=0 to htmlNb-1
  • n=Max(Len(htmlNom(i)),n)
  • next
  • for i=0 to htmlNb-1
  • s=htmlNom(i) & Space(n-Len(htmlNom(i))) & " "
  • s=s & htmlDebut(i) & " "
  • s=s & htmlFin(i) & " "
  • If html(i) Is Nothing Then
  • s=s & "En attente"
  • Else
  • s=s & "Actif"
  • End If
  • log.WriteLine s
  • next
  • log.close
  • ' on donne le focus au powerpoint
  • ' (utile si le script est lancé par le planificateur de tâches)
  • ' shl.AppActivate "Diaporama PowerPoint"
  • shl.AppActivate ppt.ProcessID
  • End Sub
  • '--------------------------------------------------------------------------------------------------
  • Sub TraiterHtml(nom)
  • '
  • ' Ajout d'un fichier HTML dans les tableaux html*
  • ' lecture de la programmation dans les Métadonnées
  • '
  • Dim fic,ts,debut,fin,s
  • Set fic=fso.GetFile(repExe & "\" & nom)
  • ' lecture du fichier (métadonnées)
  • Set ts=fic.OpenAsTextStream(1) ' 1 = ouverture en lecture
  • Do Until ts.AtEndOfStream
  • s = Trim(Lcase(ts.ReadLine))
  • If Left(s,28)="<meta name=""debut"" content=""" Then
  • debut=CDate(Mid(s,29,Len(s)-30))
  • ElseIf Left(s,26)="<meta name=""fin"" content=""" Then
  • fin=CDate(Mid(s,27,Len(s)-28))
  • End If
  • If Not(Isempty(debut) Or Isempty(fin)) Then Exit Do
  • Loop
  • ts.Close
  • ' si début et/ou fin n'ont pas pu être lus, on met Now aux deux
  • ' comme ça le fichier sera supprimé dès la prochaine itération
  • If Isempty(debut) Or Isempty(fin) Then
  • debut=Now
  • fin=Now
  • End If
  • ' Mise à jour des tableaux
  • i=ArrayGetIndex(htmlNom,nom)
  • If IsNull(i) Then
  • i=htmlNb
  • If i=0 Then
  • Redim htmlNom(i)
  • Redim htmlDateFic(i)
  • Redim htmlDebut(i)
  • Redim htmlFin(i)
  • Redim html(i)
  • Else
  • Redim Preserve htmlNom(i)
  • Redim Preserve htmlDateFic(i)
  • Redim Preserve htmlDebut(i)
  • Redim Preserve htmlFin(i)
  • Redim Preserve html(i)
  • End If
  • htmlNb=i+1
  • End If
  • htmlNom(i)=nom
  • htmlDateFic(i)=fic.DateLastModified
  • htmlDebut(i)=debut
  • htmlFin(i)=fin
  • Set html(i)=Nothing
  • End Sub
  • '--------------------------------------------------------------------------------------------------
  • function ArrayGetIndex(sourceArray,searchValue)
  • Dim i
  • If Not IsArray(sourceArray) Then
  • ArrayGetIndex=Null
  • Else
  • For i=0 To Ubound(sourceArray)
  • If searchValue=sourceArray(i) Then Exit For
  • Next
  • If i>Ubound(sourceArray) Then
  • ArrayGetIndex=Null
  • Else
  • ArrayGetIndex=i
  • End If
  • End If
  • End Function
  • '--------------------------------------------------------------------------------------------------
  • Sub ArrayAppend(sourceArray,appendValue)
  • If IsEmpty(sourceArray) Then
  • Redim sourceArray(0)
  • Else
  • Redim Preserve sourceArray(Ubound(sourceArray)+1)
  • End If
  • sourceArray(Ubound(sourceArray))=appendValue
  • End Sub
  • '--------------------------------------------------------------------------------------------------
  • Function Max(a,b)
  • If b>a Then
  • Max=b
  • Else
  • Max=a
  • End If
  • End Function
'
' Démarrage du powerpoint et maj par visite du dossier Depot toutes les 5 sec.
' Gestion des bandeaux
'
Const repDep="C:\Borne\Depot"    ' dossier de dépot
Const repExe="C:\Borne\Exec"     ' dossier d'exécution
Const repArc="C:\Borne\Archives" ' dossier d'archivage des anciens ppt (indiquer une chaine vide si pas d'archivage)
Const pptExe="Borne.ppt"      ' fichier powerpoint d'exécution
Const pptLcd="""C:\Program Files\Microsoft Office 2K3\OFFICE11\POWERPNT.EXE"" /s " ' ligne de commande powerpoint (sans nom de fichier)
'Const pptLcd="""C:\Program Files\Microsoft Office\Office10\POWERPNT.EXE"" /s "    ' ligne de commande powerpoint (sans nom de fichier)
Const banLcd="C:\Borne\Bandeau.exe " ' ligne de commande de l'afficheur de bandeau
Const delai=5000              ' nombre de millisecondes entre chaque itération

Dim fso ' objet Scripting.FileSystemObject
Dim shl ' objet WScript.Shell
Dim ppt ' objet powerpoint
Dim htmlNom     ' nom des fichiers HTML en cours (tableau)
Dim htmlDateFic ' date des fichiers HTML en cours (tableau)
Dim htmlDebut   ' horaire de début des fichiers HTML en cours (tableau)
Dim htmlFin     ' horaire de fin des fichiers HTML en cours (tableau)
Dim html        ' objets HTML en cours (tableau)
Dim htmlNb      ' nombre de fichiers HTML en cours
'--------------------------------------------------------------------------------------------------
Dim nom,ext,rep,ficcol,fic,i

' initialisations diverses
htmlNb=0
Set fso = CreateObject("Scripting.FileSystemObject")
Set shl = CreateObject("WScript.Shell")
set ppt=nothing

' on considère que le dossier d'exécution doit contenir un Borne.ppt au démarrage
If Not fso.FileExists(repExe & "\" & pptExe) Then
	msgbox "Fichier " & repExe & "\" & pptExe & " innexistant...",vbCritical,"Borne"
	WScript.Quit
End If

' construction des tableaux html* avec les fichiers présents dans le dossier Exec
Set rep = fso.GetFolder(repExe)
Set ficCol = rep.Files
For Each fic in ficCol
	ext=ucase(fso.GetExtensionName(fic.name))
	If ext="HTM" or ext="HTML" Then ' on ne s'intéresse qu'aux fichiers HTML
		nom=fso.GetFileName(fic.name)
		If fso.FileExists(repDep & "\" & nom) Then
			' le fichier est toujours présent dans Depot
			Call TraiterHtml(nom)
		Else
			' le fichier n'est plus dans Depot -> il a été "déprogrammé" depuis la dernière exécution
			fic.Delete(True)
		End If
	End If
Next

' Boucle principale jusqu'à ce que le powerpoint soit interrompu
do

	call Depot
	WScript.Sleep delai

loop while ppt.Status=0

' avant de quitter, interruption des éventuels HTML qui tourneraient encore
For i=0 To htmlNb-1
	If Not html(i) Is Nothing Then
'		shl.AppActivate htmlNom(i)
'		shl.SendKeys "%{F4}"
		html(i).Terminate
	End If
Next


'--------------------------------------------------------------------------------------------------
Sub Depot()
	'
	' rapatriement d'un éventuel powerpoint présent dans le dossier Dépot
	' lancement du powerpoint si premier appel ou changement de powerpoint
	' traitement des fichiers HTML (bandeau)
	'
	dim maj,ind,log,ficbak,dte,n,s

	' parcours des fichiers powerpoint du dossier Depot
	Set rep = fso.GetFolder(repDep)
	Set ficCol = rep.Files
	maj = false
	For Each fic in ficCol
		ext=ucase(fso.GetExtensionName(fic.name))
		if ext="PPS" or ext="PPT" then ' on ne s'intéresse qu'aux ppt et pps
			if maj then
				' un powerpoint a déjà été trouvé. Si on en trouve d'autres, on les supprime
				' (sinon, ils seraient utilisés 5 secondes plus tard)
				fic.Delete(True)
			else
				' un powerpoint est trouvé. Si le powerpoint courant est en train de tourner,
				' on commence par l'arrêter.
				if not ppt is nothing then ppt.Terminate
				' destruction ou archivage du powerpoint courant
				if repArc="" then
					' pas d'archivage -> destruction du fichier
					fso.DeleteFile repExe & "\" & pptExe,true
				else
					' archivage du fichier
					' récupération de la date du fichier courant
					set ficbak = fso.GetFile(repExe & "\" & pptExe)
					dte = ficbak.DateLastModified
					' construction d'une chaine de date type "yymmddhhmmss"
					s = Right(Cstr(Year(dte)),2) & Right(Cstr(Month(dte)+100),2) & Right(Cstr(Day(dte)+100),2) & Right(Cstr(Hour(dte)+100),2) & Right(Cstr(Minute(dte)+100),2) & Right(Cstr(Second(dte)+100),2)
					' construction du nom de fichier d'archive (ajout date avant le point)
					s = Replace(pptExe,".",s & ".")
					' déplacement/renommage du fichier dans le dossier d'archive
					ficbak.Move(repArc & "\" & s)
				end if
				' déplacement du powerpoint déposé dans le dossier d'exécution en le renommant Borne.ppt
				fic.Move(repExe & "\" & pptExe)
				' lancement du nouveau powerpoint (asynchrone)
				Set ppt = shl.Exec(pptLcd & """" & repExe & "\" & pptExe & """")
				maj = True
			end if
		end if
	Next
	if ppt is nothing then
		' on est ici si premier appel à Depot() et pas ne nouveau powerpoint dans le dossier Depot
		' lancement du powerpoint (asynchrone)
		Set ppt = shl.Exec(pptLcd & """" & repExe & "\" & pptExe & """")
	end if
	' parcours des fichiers HTML du dossier Depot
	For Each fic in ficCol
		ext=ucase(fso.GetExtensionName(fic.name))
		if ext="HTM" or ext="HTML" then ' on ne s'intéresse qu'aux fichiers HTML
			nom=fso.GetFileName(fic.name)
			ind=ArrayGetIndex(htmlNom,nom)
			If IsNull(ind) Then
				' c'est un nouveau fichier
				fic.Copy(repExe & "\" & nom)
				Call TraiterHtml(nom)
			Else
				' le fichier est déjà réferencé
				If htmlDateFic(ind)<>fic.DateLastModified Then
					' le fichier a été modifié -> il faut le retraiter
					If html(ind) Is Nothing Then
						' on ne peut le retraiter que s'il n'est pas encore en train de tourner
						fic.Copy(repExe & "\" & nom)
						Call TraiterHtml(nom)
					End If
				End If
			End If
		end if
	Next
	' parcours des HTML en attente
	ind=0
	Do While ind<htmlNb
		If html(ind) Is Nothing Then
			' le HTML n'est pas en train de tourner
			If htmlFin(ind)<=Now Or Not fso.FileExists(repDep & "\" & htmlNom(ind)) Then
				' la programmation du fichier appartient au passé
				'    OU
				' le fichier à été supprimé de Depot -> sa programation est annulée
				' on supprime le fichier dans les dossier Exec et Depot
				fso.DeleteFile repExe & "\" & htmlNom(ind),True
				If fso.FileExists(repDep & "\" & htmlNom(ind)) Then
					fso.DeleteFile repDep & "\" & htmlNom(ind),True
				End If
				' on supprime les entrées dans les tableaux
				For i=ind to htmlNb-2
					htmlNom(i)=htmlNom(i+1)
					htmlDateFic(i)=htmlDateFic(i+1)
					htmlDebut(i)=htmlDebut(i+1)
					htmlFin(i)=htmlFin(i+1)
					Set html(i)=html(i+1)
				Next
				htmlNb=htmlNb-1
				If htmlNb=0 Then
					htmlNom=Empty
					htmlDateFic=Empty
					htmlDebut=Empty
					htmlFin=Empty
					html=Empty
				Else
					Redim Preserve htmlNom(htmlNb-1)
					Redim Preserve htmlDateFic(htmlNb-1)
					Redim Preserve htmlDebut(htmlNb-1)
					Redim Preserve htmlFin(htmlNb-1)
					Redim Preserve html(htmlNb-1)
				End If
				ind=ind-1
			ElseIf htmlDebut(ind)<=Now Then
				' il faut le lancer
				Set html(ind) = shl.Exec(banLcd & """" & repExe & "\" & htmlNom(ind) & """")
			End If
		Else
			' le html est en train de tourner
			If htmlFin(ind)<=Now Then
				' il faut l'arrêter
'				shl.AppActivate htmlNom(ind)
'				shl.SendKeys "%{F4}"
				html(ind).Terminate
				set html(ind)=Nothing
			End If
		End If
		ind=ind+1
	Loop
	
	' ecriture du log
	set log=fso.CreateTextFile(repDep & "\" & "log.txt",true)
	set fic=fso.GetFile(repExe & "\" & pptExe)
	log.WriteLine pptExe & " - " & fic.DateLastModified
	n=0
	for i=0 to htmlNb-1
		n=Max(Len(htmlNom(i)),n)
	next
	for i=0 to htmlNb-1
		s=htmlNom(i) & Space(n-Len(htmlNom(i))) & " "
		s=s & htmlDebut(i) & " "
		s=s & htmlFin(i) & " "
		If html(i) Is Nothing Then
			s=s & "En attente"
		Else
			s=s & "Actif"
		End If
		log.WriteLine s
	next
	log.close

	
	' on donne le focus au powerpoint
	' (utile si le script est lancé par le planificateur de tâches)
'	shl.AppActivate "Diaporama PowerPoint"
	shl.AppActivate ppt.ProcessID
End Sub
'--------------------------------------------------------------------------------------------------
Sub TraiterHtml(nom)
	'
	' Ajout d'un fichier HTML dans les tableaux html*
	' lecture de la programmation dans les Métadonnées
	'
	Dim fic,ts,debut,fin,s

	Set fic=fso.GetFile(repExe & "\" & nom)

	' lecture du fichier (métadonnées)
	Set ts=fic.OpenAsTextStream(1) ' 1 = ouverture en lecture
	Do Until ts.AtEndOfStream
		s = Trim(Lcase(ts.ReadLine))
		If Left(s,28)="<meta name=""debut"" content=""" Then
			debut=CDate(Mid(s,29,Len(s)-30))
		ElseIf Left(s,26)="<meta name=""fin"" content=""" Then
			fin=CDate(Mid(s,27,Len(s)-28))
		End If
		If Not(Isempty(debut) Or Isempty(fin)) Then Exit Do
	Loop
	ts.Close
	
	' si début et/ou fin n'ont pas pu être lus, on met Now aux deux
	' comme ça le fichier sera supprimé dès la prochaine itération
	If Isempty(debut) Or Isempty(fin) Then
		debut=Now
		fin=Now
	End If

	' Mise à jour des tableaux
	i=ArrayGetIndex(htmlNom,nom)
	If IsNull(i) Then
		i=htmlNb
		If i=0 Then
			Redim htmlNom(i)
			Redim htmlDateFic(i)
			Redim htmlDebut(i)
			Redim htmlFin(i)
			Redim html(i)
		Else
			Redim Preserve htmlNom(i)
			Redim Preserve htmlDateFic(i)
			Redim Preserve htmlDebut(i)
			Redim Preserve htmlFin(i)
			Redim Preserve html(i)
		End If
		htmlNb=i+1
	End If
	htmlNom(i)=nom
	htmlDateFic(i)=fic.DateLastModified
	htmlDebut(i)=debut
	htmlFin(i)=fin
	Set html(i)=Nothing
End Sub
'--------------------------------------------------------------------------------------------------
function ArrayGetIndex(sourceArray,searchValue)
	Dim i
	If Not IsArray(sourceArray) Then
		ArrayGetIndex=Null
	Else
		For i=0 To Ubound(sourceArray)
			If searchValue=sourceArray(i) Then Exit For
		Next
		If i>Ubound(sourceArray) Then
			ArrayGetIndex=Null
		Else
			ArrayGetIndex=i
		End If
	End If
End Function
'--------------------------------------------------------------------------------------------------
Sub ArrayAppend(sourceArray,appendValue)
	If IsEmpty(sourceArray) Then
		Redim sourceArray(0)
	Else
		Redim Preserve sourceArray(Ubound(sourceArray)+1)
	End If
	sourceArray(Ubound(sourceArray))=appendValue
End Sub
'--------------------------------------------------------------------------------------------------
Function Max(a,b)
	If b>a Then
		Max=b
	Else
		Max=a
	End If
End Function

Conclusion

Ce montage très simple est à mon avis un gage de robustesse (nécessaire pour ce type d'application) par rapport à un système dédié plus "usine à gaz". La présentation peut néanmoins être sophistiquée car un PowerPoint peut inclure des tas de choses (images, vidéos, animations flash...)

 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Historique

19 janvier 2009 10:38:04 :
Pour info : j'ai finalement développé le bandeau défilant
09 février 2009 16:27:54 :
Je propose une mise à jour importante permettant la gestion de bandeaux d'annonce défilants et translucides en surimpression du PowerPoint en cours (sur les conseils de gillardg). Cela utilise des fichiers HTML et un petit visualiseur, exécutable en C#.net dont j'ai joint les sources a toutes fins utiles. Le code VBS a nettement pris de l'embonpoint puisqu'il passe de 68 à 317 lignes. J'ai placé cette nouvelle version dans le dossier Borne.v2 et j'ai laissé la première version dans Borne.v1 pour ceux qui n'utilisent pas les bandeaux. Le bandeau est un petit fichier HTML. On personnalisera le message en éditant directement le fichier HTML. Les heures de début et de fin d'affichage du bandeau sont également codées dans le fichier HTML derrière des balises meta "Debut" et "Fin". Toutes ces opérations sont très simples, pas besoin de connaitre le HTML pour comprendre comment mettre à jour le bandeau (avec le jeu de fichiers joint) et l'avantage du HTML est que celui-ci est complètement personnalisable. Une fois le fichier HTML prêt, il suffit, comme pour le Powerpoint, de le déposer dans le dossier de dépôt. Il est possible de programmer à l'avance plusieurs bandeaux, voire même avec chevauchements (dans ce cas, pour une meilleure lisibilité, il vaudra mieux en placer un en bas et l'autre en haut de l'écran...) !
09 février 2009 16:37:55 :
Mise en ligne de la version 2 : gestion des bandeaux défilants.
09 février 2009 16:51:02 :
Mise en ligne de la version 2 : gestion des bandeaux défilants.
09 février 2009 16:59:48 :
J'ai intégré l'option d'archivage de Kopilotk dans la v2

Commentaires et avis

signaler à un administrateur
Commentaire de oommeeggaa3d le 30/10/2008 09:12:08

Je ne saurais trop te conseiller de mettre une capture d'écran ...

signaler à un administrateur
Commentaire de piergel le 30/10/2008 09:51:21

Il n'y a rien de visuel ! c'est du code qui tourne en arrière plan, qui scrute un dossier, manipule des fichiers, arrête ou lance PowerPoint... Je ne vois pas trop ce que je pourrais mettre comme capture à part mon éditeur de code !  :)

signaler à un administrateur
Commentaire de neo2k2 le 30/10/2008 10:08:39 9/10

Ben OOMMEEGGAA3D...

Set ppt = shl.Exec(lcd & """" & exe & """")
shl.AppActivate "Diaporama PowerPoint"

C'est pour lancer Powerpoint, à quoi servirait une capture? Tu connais sûrement déjà Powerpoint; c'est du VBS, pas du VB6... ;o)

Sinon au niveau de la source, je conseillerais d'éviter les accents et les espaces dans les noms de fichiers. Préférer des underscore pour séparer les mots: _ ;o)

Le code est très propre et bien commenté!

Je serais tenté d'ajouter des variables d'environnement pour faire plus portable car on ne sait pas sur quel disque est installé Office:

Set WshShell = CreateObject("WScript.Shell")
ProgramFolder = WshShell.ExpandEnvironmentStrings("%ProgramFiles%") '
Wscript.echo ProgramFolder

Le seul hic que je constate est que tu installes Office au complet sur une borne multimedia. Pour plus de sécurité, confort et aisance, je te recommande d'installer la visionneuse Powerpoint...
Const lcd="""C:\Program Files\Microsoft Office 2K3\OFFICE11\POWERPNT.EXE"" /s "
... devient (en tenant compte de ma précédente remarque)...
Const lcd= ProgramFolder & """\Microsoft Office\OFFICE12\POWERVIEW.EXE"" /s "
...et le tour est joué!

Allez, je te donne 9 car je suis en forme ce matin!

signaler à un administrateur
Commentaire de piergel le 30/10/2008 10:29:35

Merci pour le commentaire (et la note) Neo2k2. C'est vrai que j'aurais pu être plus fin dans la localisation de l'exécutable PowerPoint mais je n'ai pas cherché à fignoler. Quatre constantes à définir au début du vbs ne m'ont pas semblé trop contraignant et une fois que la borne est installée, on y touche plus !

J'ai expliqué en fin de description pourquoi j'utilisais PowerPoint et pas la visionneuse... En ajoutant que l'emploi de cette dernière était bien sur possible. Peux-tu expliquer "pour plus de sécurité, confort et aisance", particulièrement "sécurité" ? Je ne vois pas en quoi l'utilisation de PowerPoint plutôt que la visionneuse serait préjudiciable à la sécurité. La borne n'a ni clavier ni souris et l'écran n'est pas tactile. La sécurité d'accès à distance est assurée par mots de passe (Windows et vnc).

signaler à un administrateur
Commentaire de gillardg le 30/10/2008 14:29:54

pour ton idée d'une petite appli pour faire défiler du texte dans une fenètre transparente :
une appli vb.net un form backcolor white , transparencykey white topmost=true formborderstyle=none
avec un webbrowser et dans l'evenement load de ta form tu fais webbrowser.naviguate("path" & "fichier")
dont voici le contenu

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
    <title>Untitled Page</title>
</head>
<body style="background-color: transparent">
<marquee behavior=alternate direction=left> <a > Ton texte à scroller ici</a></marquee>
</body>
</html>

signaler à un administrateur
Commentaire de piergel le 31/10/2008 08:57:14

Merci beaucoup GillardG ! J'ai testé ça marche nickel. Me reste plus qu'à peaufiner (fond en couleur translucide pour le bandeau avec Opacity à 80% sur la form)...
Et le principe d'une page HTML me convient parfaitement, ça rend le truc personnalisable facilement : la mécanique est dans la petite appli, le look dans le fichier HTML.

signaler à un administrateur
Commentaire de BadoqueAlex le 02/11/2008 17:54:07 5/10

Moais ... Il à pas inventé l'eau chaude quand même ... 5/10

signaler à un administrateur
Commentaire de piergel le 03/11/2008 10:18:36

Mais je n'ai jamais prétendu avoir inventé l'eau chaude avec cette source ! :)
J'ai bien pris soin de la mettre en "Débutant".
C'est sur que le code n'a rien de transcendant mais j'ai pensé que l'idée pouvait intéresser quelques personnes...
Si ça peut te rassurer, il m'arrive de travailler sur des projets plus complexes sinon mon patron m'aurait viré depuis longtemps ! lol

signaler à un administrateur
Commentaire de BadoqueAlex le 03/11/2008 17:46:17

Ce n'était pas méchant quand je disais cela mais ce qui me gêne, c'est la notation laxiste des gens.. 9/10, faut pas pousser ... Enfin ta source est bonne, pas excellente. c'est le principal ^^

signaler à un administrateur
Commentaire de BadoqueAlex le 03/11/2008 17:48:36

PS: Le 5/10 n'est pas la valeur du code mais juste ce qu'il faut pour que le code ai une moyenne qui reflète sa qualité ^^ (Je prétend pas faire du code parfait hein, mais bon, Nobody is perfect ^^)

signaler à un administrateur
Commentaire de piergel le 03/11/2008 18:10:25

Je trouve aussi que 9, c'était beaucoup d'honneur pour ce petit bout de code ;)
Cependant, je ne trouve pas ça honnête de "calculer" une note pour que la moyenne corresponde à la note que toi tu considères juste. Ça veut dire que tu ne respectes pas les notes des autres. Si tu penses que ça vaut 7, il faut mettre 7...
C'était juste une petite remarque en passant car sur le reste on est d'accord.
Sans rancune ! ^^

signaler à un administrateur
Commentaire de BadoqueAlex le 03/11/2008 18:17:19

D'accord avec toi Piergel mais sinon, on se retrouve avec des morceaux de code dans les meilleurs notes quand on fait un tri dans la recherche et les meilleurs notes ne correspondent plus à rien ...

signaler à un administrateur
Commentaire de eli42 le 19/01/2009 01:04:00 8/10

Bonjour, moi meme je diffuse du ppt sur des ecrans, pour linstant je reconverti mes PPT en vidéo WMV avec PPT2DVD, et je les lance via une playlist, donc je vais me pencher sur ce code qui d'apres moi est tres bon, juste un truc peut on, simuler le clic pour faire défiler les diapos. Encore chapeau bonne continuation.

signaler à un administrateur
Commentaire de piergel le 19/01/2009 10:33:03

Bonjour, merci pour ton appréciation !
Il n'y a pas besoin de "simuler le clic" pour faire défiler les diapos d'un Powerpoint, l'enchainement des diapos est entièrement paramétrable dans Powerpoint : clic, temporisation ou les deux (menu Diaporama/Transitions...).

signaler à un administrateur
Commentaire de eli42 le 19/01/2009 13:31:59

Re, dsl j'ai fait de la rétention dans mon commentaire, oui certe on peu parametrer, mais pour eviter de me retapper 173 PPT, tu me diras je pourrais justifier mon travail par les temps qui courent.
Je maintiens ma note 8/10 elle est basé sur 6 pour le code et 2 pour l'idée. Tu rajoutes une playlist le clic auto, et tu as le prix Nobel 2009.

Cordialement.

signaler à un administrateur
Commentaire de piergel le 19/01/2009 13:55:28

La playlist est une bonne idée. C'est d'ailleurs une option proposée par les solutions commerciales de borne. Mais personnellement je n'en ai pas l'utilité car je n'aurai toujours qu'un seul Powerpoint. Même chose pour le clic auto. Je te laisse donc t'occuper de ces deux points et ainsi nous partagerons le prix Nobel ! ;)
Une petite suggestion : Il ne doit pas être très difficile de faire une petite macro VBA qui parcourt tes 173 PPT et remplace les transitions manuelles en transitions automatiques temporisées...
PS : j'ai finalisé l'option "bandeau défilant translucide programmable" (voir plus haut) mais pas eu le temps de mettre à jour ma source...

signaler à un administrateur
Commentaire de Kopilotk le 05/02/2009 10:20:52

Bonjour,

Merci pour ce script qui fonctionne très bien.

Il me faudrait par contre une modification que je suis incapable de faire, il faudrait que la nouvelle présentation soit copiée à 2 endroits bien distinct, pour faire un backup en faite.
Quelqu'un peut il m'aider ?

Merci.

signaler à un administrateur
Commentaire de piergel le 05/02/2009 19:05:47

Je te propose un mécanisme qui déplace et renomme le powerpoint courant en cas de mise à jour (au lieu de le supprimer) :

Ligne à ajouter au début dans les déclarations :
Const arc="C:\Borne\Archives" ' dossier d'archivage des anciens ppt

Lignes à ajouter en remplacement de la ligne fso.DeleteFile exe,true :
' archivage du fichier courant :
' récupération de la date du fichier courant
set ficbak = fso.GetFile(exe)
dte = ficbak.DateLastModified
' construction d'une chaine de date type "yymmddhhmmss"
txt = Right(Cstr(Year(dte)),2) & Right(Cstr(Month(dte)+100),2) & Right(Cstr(Day(dte)+100),2) & Right(Cstr(Hour(dte)+100),2) & Right(Cstr(Minute(dte)+100),2) & Right(Cstr(Second(dte)+100),2)
' déplacement/renommage du fichier dans le dossier d'archive
ficbak.Move(arc & "\Borne" & txt & ".ppt")

Pour faire propre, ajouter les déclarations de ficbak, dte et txt.

Je n'ai pas testé mais ça devrait fonctionner...

signaler à un administrateur
Commentaire de Kopilotk le 05/02/2009 21:35:51

Merci Piergel !!

J'essaie dès demain matin et je donnerais un retour de la modif.

Kop.

signaler à un administrateur
Commentaire de Kopilotk le 06/02/2009 09:08:51

Bonjour,

Piergel ... ça marche nickel du tonnerre !!!

Merci pour cette modif Ô combien importante.

Bonne journée.

Kop.

signaler à un administrateur
Commentaire de titox le 07/02/2009 20:20:29

Bonjour,
je serais intéresser par la manière que tu as utilisé pour faire le bandeau qui défile, et pourquoi pas ta source ;)

Merci

signaler à un administrateur
Commentaire de cryenne le 29/05/2009 10:51:04

salut
super ce ptit programme,
deja j y connais rien

mais serait il possible de lui faire executer plusieurs fichier ppt qui serait dans le depot (si nouveau) puis dans le rep exec et en boucle
en fait j ai different service qui font des ppt les depose puis diffusion

merci

signaler à un administrateur
Commentaire de piergel le 29/05/2009 11:32:38

Bonjour

Le principe est qu'un ppt déposé remplace le précédent. Si on doit en exécuter plusieurs, comment sait-on si un ppt s'ajoute ou en remplace un autre (et lequel) ?
On pourrait résoudre ce point en gérant plusieurs dossiers Dépôt et Exec.
Se pose un autre problème à creuser : comment enchainer proprement plusieurs ppt en visu ?

Je donne juste ces pistes de réflexion car je n'ai pas du tout le temps de me pencher sur le problème en ce moment, désolé. Mais si quelqu'un d'autre veut s'y coller, je n'y vois aucun inconvénient !

signaler à un administrateur
Commentaire de cryenne le 29/05/2009 13:11:07

salut

avec une playlist,
le probleme c est de lui dire de boucler a la fin de la playlist
j arrive a faire une playlist avec pwp mais le probleme c est de boucler

deja merci de la reponse

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Composants EXCEL 8, Word 8, PowerPoint 8 dans VB5 [ par PPI ] Je suis à la recherche de code permettant l'utilisation des composantsExcel 8 (excel97)Word 8 (Word97)PowerPoint 8 (Ppt97)dans un programme VB5.Pas un Insertion doc PowerPoint dans une form??? [ par pifou ] Comment inserer un document powerpoint dans une form.Merci de votre aide. durée fichier multimédia [ par Dan ] SalutEst-ce-qu'il existe une fonction ou un api capable de donner la durée d'un fichier mulmédia?Windows le fait dans le menu propriété d'un fichier,c Imprimer une présentation PowerPoint par un bouton [ par Estelle ] Bonjour,Débutante, je cherche le moyen de parvenir, lors de la visualisation d'une présentation PowerPoint, à imprimer l'ensemble de la présentation e créer un questionnaire powerpoint [ par Yo ] Je souhaite faire un vrai/faux avec powerpoint et j'aimerai que lorsqu'on clique la bonne réponse, le score augmente et que ca passe à la question sui Recherche OCX pour jouer PowerPoint [ par gilles ] Bonjour,je recherche un ocx qui joue des presentations de type powerpoint.j'utilise actuellement la visionneuse maisje ne peux pas la redimensionner p Vb6 et PowerPoint [ par anspauldou ] SalutJe voudrai aussi activer mes diapositives sous PowerPoint par Vb6.Merci d'avance ouvrir un diaporama Powerpoint (.pps) en VBA sous Excel [ par rvduclos ] SalutEst-ce que quelqu'un à une idée pour lancer un diaporama sous Excel.Je ne comprends pas pourquoi un shell ne fonctionne pas ?Shell ("C:\WINDOWS\B Lecteur multimédia : ajouter un visuel... [ par Jér-o-nimo ] Salut!Je suis en train de créer un lecteur audio et je voudrais intégrer un visuel ( vu-metre, etc...) . Je sais pas comment faire! (logique, sinon je Appel d'une sous-routine d'un exécutable VB à partir d'une macro VBA sous PowerPoint [ par lgagnier ] Bonjour,J'ai un petit problème, probablement rien de compliqué à règler, mais comme je ne suis pas encore familié avec la programmation VB et VBA j'ai


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,421 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.