tripleflo
Goto Top

Popup Fenster erstellen

Hallo zusammen,

Ich hätte da mal eine Frage. Ich bin kein Spezialist in Sachen programmieren und würde dennoch gerne ein bisschen was machen.

Ich habe eine Kamera, die speichert auf einer NAS Bilder von Personen die in den Empfangsbereich eintreten. Jetzt hätte ich gerne ein Popupfenster, dass mir das gerade eben gemachte Bild auf meinem PC am Bildschirm zeigt. Die NAS ist mit Benutzern und Passwörtern gespeichert.

Könntet ihr mir vielleicht ein wenig dabei helfen und mir auch ein bisschen was darüber erklären damit ich mich Prinzipiell auskenne?


Danke schon im Vorhinein

Gruß

Florian

Content-ID: 268632

Url: https://administrator.de/contentid/268632

Ausgedruckt am: 25.11.2024 um 06:11 Uhr

eisbein
eisbein 09.04.2015 aktualisiert um 11:12:54 Uhr
Goto Top
Hallo!

Ein paar zusätzliche Infos könnten uns die Sache sehr erleichtern face-wink

Warum VBA? Wäre auch zb. PowerShell möglich?
Welches Betriebssystem / Umgebung hat der Rechner, der das Programm ausführen soll?
Wie werden die Fotos gespeichert? Dateiname = fortlaufende Nummer?
Welche Kamera?

Gruß
Eisbein
TripleFlo
TripleFlo 09.04.2015 um 11:17:09 Uhr
Goto Top
Hey!

OK. Nachdem ich mich gar nicht auskenne würde ich gerne den unterschied zwischen VBA und PowerShell wissen. face-smile Bin in Hinsichten Programmieren ein absoluter Anfänger.

Betriebssystem: Windows 7 Pro Umgebung wäre egal.
Fotos werden in Datum und Uhrzeit gespeichert: 20150409_11-12-19
Kamera ist ein Axis P1354 IP Cam.

Gruß
Florian
colinardo
colinardo 09.04.2015 aktualisiert um 11:42:42 Uhr
Goto Top
Hallo Florian,
mit Powershell z.B. so: (Informationen über Powershell-Scripte findest du ganz unten im Kommentar)

In den ersten Zeilen legst du den Ordner fest in dem die Bilder gespeichert werden. Das Script zeigt dann das aktuellste Bild in diesem Ordner in einem Fenster an.

Wenn kein Powershell gewünscht ist, lässt sich das auch mit einem HTA-File und VBS machen, oder gleich mit einer richtigen Programmiersprache (VB.Net/C#).
#---------------------------------------
# Ordner in dem die Bilder liegen
$folder = "\\Server\Freigabe\images"  
# hole aktuellstes Bild im Ordner
$newestfile = gci $folder -Filter *.jpg | sort -Descending -Property LastWriteTime | select -First 1 -ExpandProperty Fullname
#---------------------

$showWindowAsync = Add-Type –memberDefinition @” 
[DllImport("user32.dll")]   
public static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow); 
“@ -name “Win32ShowWindowAsync” -namespace Win32Functions –passThru

function Hide-PowerShell() { 
    [void]$showWindowAsync::ShowWindowAsync((Get-Process –id $pid).MainWindowHandle, 2) 
}

#region Import the Assemblies
[reflection.assembly]::loadwithpartialname("System.Windows.Forms") | Out-Null  
[reflection.assembly]::loadwithpartialname("System.Drawing") | Out-Null  
#endregion

#region Generated Form Objects
$formMain = New-Object System.Windows.Forms.Form
$pictureBox1 = New-Object System.Windows.Forms.PictureBox
$InitialFormWindowState = New-Object System.Windows.Forms.FormWindowState
#endregion Generated Form Objects

#----------------------------------------------
#Generated Event Script Blocks
#----------------------------------------------
#Provide Custom Code for events specified in PrimalForms.
$handler_formMain_Load= 
{
    $pictureBox1.Load($newestfile)
}

$OnLoadForm_StateCorrection=
{#Correct the initial state of the form to prevent the .Net maximized form issue
	$formMain.WindowState = $InitialFormWindowState
}

#----------------------------------------------
#region Generated Form Code
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 600
$System_Drawing_Size.Width = 800
$formMain.ClientSize = $System_Drawing_Size
$formMain.DataBindings.DefaultDataSourceUpdateMode = 0
$formMain.Name = "formMain"  
$formMain.Text = "Bild-Popup"  
$formMain.add_Load($handler_formMain_Load)


$pictureBox1.DataBindings.DefaultDataSourceUpdateMode = 0
$pictureBox1.Dock = 5

$System_Drawing_Point = New-Object System.Drawing.Point
$System_Drawing_Point.X = 0
$System_Drawing_Point.Y = 0
$pictureBox1.Location = $System_Drawing_Point
$pictureBox1.Name = "pictureBox1"  
$System_Drawing_Size = New-Object System.Drawing.Size
$System_Drawing_Size.Height = 320
$System_Drawing_Size.Width = 390
$pictureBox1.Size = $System_Drawing_Size
$pictureBox1.SizeMode = 4
$pictureBox1.TabIndex = 0
$pictureBox1.TabStop = $False

$formMain.Controls.Add($pictureBox1)

#Save the initial state of the form
$InitialFormWindowState = $formMain.WindowState
#Init the OnLoad event to correct the initial state of the form
$formMain.add_Load($OnLoadForm_StateCorrection)
# hide powershell Window
Hide-PowerShell
#Show the Form
$formMain.ShowDialog()| Out-Null

Grüße Uwe


back-to-topAnleitung: Wie starte ich Powershell-Scripte
  • Zuerst speichert man den Code in einer Textdatei mit der Endung .ps1.
  • Wenn man zum ersten mal Powershell-Scripte ausführt, musst man einmalig vorher noch das Ausführen von Scripten im User-Account freischalten. Dazu öffnet man eine Powershell-Konsole und gibt dort den Befehl Set-ExecutionPolicy RemoteSigned -Force ein. Um diese Policy für alle User auf dem Rechner zu setzen muss man diesen Befehl in einer Powershell-Konsole mit Admin-Rechten starten. Noch ein Hinweis für 64-Bit-Systeme: Hier sollte sowohl für die 32bit und 64Bit Variante der Powershell die Policy in einer Admin-Konsole gesetzt werden: Set-ExecutionPolicy RemoteSigned -Force; start-job { Set-ExecutionPolicy RemoteSigned -Force } -RunAs32
  • Jetzt kann das Powershell-Script wie weiter unten erläutert in einer Powershell-Konsole oder aus einer CMD-Fenster heraus ausgeführt werden. Wer lieber mit der Maus arbeitet macht einen Rechtsklick auf die Script-Datei und wählt: Mit Powershell ausführen.
  • Alternativ lässt sich ein Script auch ohne das globale Ändern der ExecutionPolicy ausführen indem man die Policy als Parameter auf der Kommandozeile mitgibt:
powershell.exe -ExecutionPolicy RemoteSigned -File "C:\Pfad\Script.ps1"
back-to-topStarten eines Scriptes in einer Powershell-Konsole
Immer den kompletten Pfad zum Script angeben, und wenn er Leerzeichen beinhaltet in Anführungszeichen einschließen:
"C:\Pfad\script.ps1"
Liegt das Script im selben Verzeichnis in dem man sich gerade befindet, kann man es auch so abkürzen:
.\script.ps1
back-to-topStarten von PS-Scripten aus Batch und Kommandozeilen heraus:
Hier gibt es unterschiedliche Methoden, je nach Anforderungen gibt es hier einige Besonderheiten vor allem bei Leerzeichen in Pfaden zu beachten!
Der einfachste Aufruf sieht hier so aus:
powershell.exe -File "C:\Pfad\Script.ps1"
Wenn man dem Script Parameter übergeben möchte:
powershell.exe -File "C:\Pfad\Script.ps1" "Parameter 1" "Parameter 2"
Wenn man "benannte" Parameter übergeben möchte (die einfachen Hochkommas um den Scriptpfad werden benötigt wenn er Leerzeichen beinhaltet):
powershell.exe -command "&'C:\Pfad\Script.ps1' -par1 'Wert1' -par2 'Wert2'"
Man kann auch mehrere Scripte hintereinander ausführen lassen:
powershell.exe -command "&'C:\Pfad\Script1.ps1';&'C:\Pfad\Script2.ps1'"
Weitere Parameter zeigt einem ein powershell -? in einer Konsole an.
back-to-topStarten von PS-Scripten in der Aufgabenplanung (Taskplaner)
In der jeweiligen Aktion unter "Programm/Script" trägt man powershell.exe ein und unter "Argumente hinzufügen (optional)" trägt man wie oben geschrieben alles was hinter powershell.exe kommt ein - also z.B. -File "C:\Pfad\Script.ps1" "Parameter 1" "Parameter 2"
eisbein
eisbein 09.04.2015 aktualisiert um 11:42:13 Uhr
Goto Top
Hallo!

Der Unterschied zwischen VBA und PowerShell lässt sich am besten nachlesen - beides sind aber keine Programmiersprachen.

Es gibt immer mehrere Lösungen für ein Problem. Die Frage ist nun, was ist hier das Anliegen?

Hier würde sich PowerShell anbieten. Hier im Forum findest man bereits Lösungen um einen Ordner auf neue Dateien zu überwachen und zu durchsuchen.

Schau dir diese Beispiele einmal an, ob das "vorstellbar" und "erlernbar" wäre face-wink

Ich kenne die Kamera nicht, aber gibt es da evtl. eine Möglichkeit bei Motionalarm auch andere Funktionen auszuführen?

Gruß
Eisbein

EDIT: @colinardo war schneller und eifriger face-smile
colinardo
colinardo 09.04.2015 aktualisiert um 12:33:17 Uhr
Goto Top
Und hier noch eine HTA-Version: (Script als *.hta speichern und in Zeile 24 den Pfad zu den Bildern angeben)
Doppelklick zeigt dann das aktuellste Bild dieses Ordners im FullScreen an ein Klick aufs Bild schließt das Fenster dann wieder.
<html>
<head>
<title>WebCam Image</title>
<HTA:APPLICATION
  APPLICATIONNAME="My FullScreen WebCam image"  
  ID="myApp"  
  VERSION="1.0"  
  BORDER="none"  
  INNERBORDER="no"  
  CAPTION="no"  
  SYSMENU="no"  
  MAXIMIZEBUTTON="no"  
  MINIMIZEBUTTON="no"  
  SCROLL="no"  
  WINDOWSTATE="maximize"  
  SHOWINTASKBAR="yes"  
  CONTEXTMENU="no"  
  SELECTION="no"/>  
</head>

<script language="VBScript">  
Dim fso,objInterval
Sub loadImage()
	Const FOLDERIMAGES = "\\Server\Share\images"  
	Dim latestImage, lastDate
	If fso.FolderExists(FOLDERIMAGES) Then
		For Each file In fso.getFolder(FOLDERIMAGES).Files
			If LCase(fso.GetExtensionName(file.Path)) = "jpg" Then  
				If lastDate = "" Then   
					lastDate = file.DateLastModified
					latestImage = file.Path
				End If
				If file.DateLastModified > lastDate Then
					lastDate = file.DateLastModified 
					latestImage = file.Path
				End If
			End If
		Next
	End If
	If latestImage <> "" Then  
		document.getElementById("img").setAttribute "src",latestImage  
	End If
	window.resizeTo screen.width, screen.height
	window.focus
End Sub

Sub Window_OnLoad
	window.resizeTo 0,0
	Set fso = CreateObject("Scripting.Filesystemobject")  
	loadImage
End Sub

Sub closeWindow
	Set fso = Nothing
	window.close
End Sub
</script>

<body bgcolor="white" style="padding:0;margin:0">  
<img id="img" src="" alt="" width="100%" height="100%" border="0" onclick="closeWindow">  
</body>
</html>
eisbein
eisbein 09.04.2015 um 12:47:46 Uhr
Goto Top
Mahlzeit!

Ein Anmerkung habe ich noch face-wink

HTA funktioniert nur mit Microsoft Internet Explorer, da es ein "Windows-Produkt" ist.
JavaScript muss in diesem Fall ebenfalls erlaubt sein!

Gruß
Eisbein
colinardo
colinardo 09.04.2015 aktualisiert um 12:58:04 Uhr
Goto Top
Zitat von @eisbein:
JavaScript muss in diesem Fall ebenfalls erlaubt sein!>
Wenn mans genau nimmt eher ActiveScripting, ist ja oben statt JavaScript > VBS im HTA face-wink

Grüße Uwe
eisbein
eisbein 09.04.2015 um 13:07:46 Uhr
Goto Top
Mahlzeit, Uwe!

Stimmt, JavaScript ist hier nichts. Schuldig und geständig face-wink

Ich habe wohl bereits mit einem Auge nach der Nachspeise geschielt .... face-smile

Gruß
Eisbein
TripleFlo
TripleFlo 09.04.2015 um 13:28:33 Uhr
Goto Top
Hallo!

Erstmals danke für diese Lösung. Funktioniert Einwand frei.

Ich hätte nur gerne, dass sobald ein Bild in den Ordner wandert dass dann das letzte Bild automatisch geöffnet wird.


Danke nochmals für eure Hilfe
eisbein
Lösung eisbein 09.04.2015 aktualisiert um 14:31:28 Uhr
Goto Top
Mahlzeit!

Für welche Version hast du dich entschieden, HTA oder PowerShell?

Mittels Timer kann man das Script nach einer bestimmten Zeit neu ausführen. (zb. alle 5 Sekunden)

Dazu müsste man aber einige Anpassungen machen, daher die Frage welche Version in Verwendung ist.

Gruß
Eisbein
TripleFlo
TripleFlo 09.04.2015 um 13:59:59 Uhr
Goto Top
Hey,

Ich habe mich für die HTA entschieden. da kenne ich mich etwas besser aus.

Aber wenn ich jetzt alle 5 Sekunden dann die Aktion durch geführt bekomme, bekomme ich doch dann immer alle 5 Sekunden das letzte Bild auch wenn kein neues dazwischen gekommen ist oder liege ich da falsch?

Gruß
Florian
colinardo
Lösung colinardo 09.04.2015 aktualisiert um 14:30:37 Uhr
Goto Top
Zitat von @TripleFlo:
Aber wenn ich jetzt alle 5 Sekunden dann die Aktion durch geführt bekomme, bekomme ich doch dann immer alle 5 Sekunden das letzte Bild auch wenn kein neues dazwischen gekommen ist oder liege ich da falsch?

Wenn du folgendes abgeändertes Script nimmst geht das:
<html>
<head>
<title>WebCam Image</title>
<HTA:APPLICATION
  APPLICATIONNAME="My FullScreen Window"  
  ID="myApp"  
  VERSION="1.0"  
  BORDER="none"  
  INNERBORDER="no"  
  CAPTION="no"  
  SYSMENU="no"  
  MAXIMIZEBUTTON="no"  
  MINIMIZEBUTTON="no"  
  SCROLL="no"  
  WINDOWSTATE="maximize"  
  SHOWINTASKBAR="yes"  
  CONTEXTMENU="no"  
  SELECTION="no"/>  
</head>

<script language="VBScript">  
Dim fso,objInterval, lastImageDate
Sub loadImage()
	Const FOLDERIMAGES = "\\Server\Share\images"  
	Dim latestImage, lastDate
	If fso.FolderExists(FOLDERIMAGES) Then
		For Each file In fso.getFolder(FOLDERIMAGES).Files
			If LCase(fso.GetExtensionName(file.Path)) = "jpg" Then  
				If lastDate = "" Then   
					lastDate = file.DateLastModified
					latestImage = file.Path
				End If
				If file.DateLastModified > lastDate Then
					lastDate = file.DateLastModified 
					latestImage = file.Path
				End If
			End If
		Next
	End If
	If latestImage <> "" And lastImageDate < lastDate Then  
		document.getElementById("img").setAttribute "src",latestImage  
		window.resizeTo screen.width, screen.height
		window.focus
		lastImageDate = lastDate
	End If
	
End Sub

Sub Window_OnLoad
	window.resizeTo 0,0
	Set fso = CreateObject("Scripting.Filesystemobject")  
	loadImage
	objInterval = window.setInterval("loadImage",5000)  
End Sub

Sub minimize
	window.resizeTo 0,0
End Sub
</script>

<body bgcolor="white" style="padding:0;margin:0">  
<img id="img" src="" alt="" width="100%" height="100%" border="0" onclick="minimize">  
</body>
</html>
Grüße Uwe
TripleFlo
TripleFlo 09.04.2015 um 14:31:21 Uhr
Goto Top
Dankeschön.
Das ist genau wonach ich gesucht habe. face-smile

Schönen Tag euch noch.
TripleFlo
TripleFlo 09.04.2015 um 14:44:55 Uhr
Goto Top
EIn kleiner Zusatz noch: Wie ist das dann beim Mac? Würde es gerne dort auch verwenden, da es sich aber hier um eine Windows basierende Form handelt wird es sicher nicht auf einem Mac unterstützt.
colinardo
colinardo 09.04.2015 aktualisiert um 14:49:29 Uhr
Goto Top
Zitat von @TripleFlo:

EIn kleiner Zusatz noch: Wie ist das dann beim Mac? Würde es gerne dort auch verwenden, da es sich aber hier um eine Windows basierende Form handelt wird es sicher nicht auf einem Mac unterstützt.
Wie du schon festgestellt hast läuft das nicht auf einem MAC ... Dort kannst du dir etwas ähnliches mit z.B. mit dem Automator basteln ... habe aber dafür im Moment keine Zeit.
TripleFlo
TripleFlo 09.04.2015 um 15:52:29 Uhr
Goto Top
Ok danke.

Ich weiß dass ich sehr nervig bin:
Jetzt habe ich es intensiver getestet und auch gespielt. face-smile Mir ist aufgefallen dass wenn ich mehr als zwei Bilder angesehen habe, dass Programm zwar offen bleibt aber keine weiteren Bilder mehr zeigt. Jetzt habe ich das genauer durch gelesen (Verständnis ist jetzt schon da) konnte den Fehler aber nicht bearbeiten.
eisbein
eisbein 09.04.2015 aktualisiert um 16:43:19 Uhr
Goto Top
Hallo!


Dim latestImage, lastDate 

latestImage beinhaltet den Dateinamen der zuletzt angesehen Datei/Bild
lastDate das Erstellungsdatum der zuletzt angesehenen Datei/Bild

Mit folgender Abfrage (Zeile 40)
If latestImage <> "" And lastImageDate < lastDate Then  
wird abgefragt ob
latestImage <> "" überhaupt eine Datei vorhanden ist UND
lastImageDate < lastDate das Erstellungsdatum der Datei aktueller ist als das der Datei, die zuvor bereits angezeigt wurde.

Ergo: Jedes neue Bild wird nur 1 x angezeigt. Wenn keine neuen Bilder da sind, wird auch nichts ausgegeben.

Wenn du die Abfrage wie folgt änderst, sollte dir immer das neue Bild angezeigt werden, solange bis es ein aktuelleres gibt:
(Zeile 40)
If latestImage <> "" And lastImageDate <= lastDate Then  

Gruß
Eisbein
colinardo
colinardo 09.04.2015 aktualisiert um 16:40:44 Uhr
Goto Top
dass Programm zwar offen bleibt aber keine weiteren Bilder mehr zeigt.
Es ist so konfiguriert das nur ein neues Bild angezeigt wird wenn auch das Änderungsdatum des aktuellen Files größer als das des letzten ist. D.h. wenn du zum Test nur Bilder kopierst wird dir kein anderes angezeigt weil es ja das selbe Änderungsdatum hat.
TripleFlo
TripleFlo 09.04.2015 um 16:49:09 Uhr
Goto Top
Danke jetzt kenn ich mich aus. face-smile