Jump to content
Sign in to follow this  
Exec

Beamer via VB Script starten

Recommended Posts

Hallo liebe Scriptler,

 

erstmal den Sinn und Zweck des Scrips:

 

Wir haben einen Beamer zwecks Werbung hinter eine Glasscheibe gestellt und an einem PC angeschlossen, auf dem können jetzt verschiedene Videos gestartet werden die auch bis spät Abends (also wenn ich nichtmehr an der Arbeit bin) laufen sollen.

 

Der Beamer ist mit dem PC via Com-Anschluss verbunden und auch ansprechbar, ich wiederum greife auf den Beamer-PC via VNC-Viewer zu.

 

Nun zu dem Problem, der PC fährt hoch, startet das Script, das Script stellt via HyperTerminal die Verbindung zu Beamer her und dann soll der Beamer mit dem Befehl "pwr on" gestartet werden. An dieser Stelle hakt es, der Command wird nicht übernommen, wenn ich dagegen das Script starte und mir anschaue was er macht bekomme ich eine positive Bestätigung und alles läuft wie geplant. Der Command ist also prinzipiell schonmal richtig, ich habe schon vieles ausprobiert und auch Pausen wie ein bekloppter eingebaut nur für den Fall das es dem PC zu schnell geht. Hier das mini-script..

 

set WshShell = CreateObject("WScript.Shell")
wscript.sleep 20000
'Schließt ein Popup das durch die Onboard-GraKa am Anfang erscheint
wshshell.Sendkeys "{ENTER}"
'Fuehrt die HyperTerminal-Datei aus
WshShell.run "C:\Beamer.ht"
'Wartet 10 Sekunden bis das Terminal geladen wurde
Wscript.sleep 10000
'Sendet den Befehl zum Anschalten des Beamers
WshShell.SendKeys "pwr on"
wscript.sleep 2000
'Bestaetigt den gesendeten Befehl 
wshShell.Sendkeys "{ENTER}"
wscript.sleep 10000
'schliesst das HyperTerminal
wshShell.sendkeys "%{F4}"
wscript.sleep 2000
'bestaetigt die Abfrage fuers schliessen
wshShell.SendKeys "{ENTER}"
wscript.sleep 3000 
'startet das Werbe-Video im VLC
wshShell.run """Pfad"""
'wscript.sleep 5000
'startet die Grossansicht des Videos
'wshShell.Sendkeys "f"
'wscript.sleep 3000 
'bringt das Video auf Fullscreen
'"^H"

 

Da das Script an sich schon oft normal funktioniert hat frage ich mich woran es sonst noch liegen könnte. Vielleicht hat jemand von euch das gleich schonmal probiert und kann mir da weiterhelfen (?)

 

Vielen Dank im Voraus und lg

Share this post


Link to post

Hallo,

 

ich habe das richtig verstanden, dass das Script als Task startet, korrekt? Dann überprüfe doch mal die Berechtigungen des ausführenden Accounts.

 

Grüße,

Robert

Share this post


Link to post

Jein, ich habe es früher als task starten lassen aber um die Fehlerquellen zu senken habe ich die vbs Datei nun einfach in den Autostart gesteckt und es startet mit sleep 10 sec nach dem Booten.

 

Als es noch als task startete habe ich die Berechtigungen schon überprüft, ich verwende einen User mit Adminrechten zum starten, ein 2ter task zum Herunterfahren läuft mit den gleichen Berechtigungen und funktioniert problemlos.

 

lg,

Exec

Share this post


Link to post

Hallo,

 

bei SendKeys kann man sich leider nie sicher sein, in welchen Kontext die Tasten geschickt werden. Such Dir am besten ein anderes (scriptfähiges) Programm für die COM-Kommunikation. Oder schreib Dir eins. Die Windows-API dazu ist recht simpel. In C++ oder VB gibt es einige Codebeispiele im Netz.

 

Grüße,

 

Sigma

 

Ein einfaches Beispiel in C++ mit fest codierten Parametern:

#include <windows.h>
#include <iostream>

int main(int argc, char* argv[])
{
   DWORD        bytes_read    = 0;    // Number of bytes read from port
   DWORD        bytes_written = 0;    // Number of bytes written to the port
   HANDLE       comport       = NULL; // Handle COM port
   int          bStatus;
   DCB          comSettings;          // Contains various port settings
   COMMTIMEOUTS CommTimeouts;

   //place code for processing command line arguments here


   char message[]="pwr on";
   char OUTBUFFER[sizeof(message)];
   wchar_t portNumber[]=L"COM5";

   //message to transmit
   strcpy_s(&OUTBUFFER[0], sizeof(message),message);

   //COM port to open
   wchar_t *file=new wchar_t;
   wcscpy_s(file,sizeof(L"\\\\.\\"),L"\\\\.\\");
   wcscat_s(file,sizeof(portNumber),portNumber);

   // Open COM port
   if ((comport = 
        CreateFile(file,                         // COM port to open
                   GENERIC_READ | GENERIC_WRITE, // for reading and writing
                   0,                            // exclusive access
                   NULL,                         // no security attributes
                   OPEN_EXISTING,              
                   FILE_ATTRIBUTE_NORMAL,
                   NULL)) == INVALID_HANDLE_VALUE)
   {
     std::wcout << L"\nsome error opening comport\n";
     return 1;    // error processing code goes here
   }
   // Set timeouts in milliseconds
   CommTimeouts.ReadIntervalTimeout         = 0; 
   CommTimeouts.ReadTotalTimeoutMultiplier  = 0; 
   CommTimeouts.ReadTotalTimeoutConstant    = 100;
   CommTimeouts.WriteTotalTimeoutMultiplier = 0;
   CommTimeouts.WriteTotalTimeoutConstant   = 100;
   bStatus = SetCommTimeouts(comport,&CommTimeouts);

   if (bStatus != 0)
   {
     std::wcout << L"\nsome error configuring comport timeouts\n";
     return 1;    // error processing code goes here
   }

   // Set Port parameters.
   // Make a call to GetCommState() first in order to fill
   // the comSettings structure with all the necessary values.
   // Then change the ones you want and call SetCommState().
   GetCommState(comport, &comSettings);
   comSettings.BaudRate = 115200;
   comSettings.StopBits = ONESTOPBIT;
   comSettings.ByteSize = 8;
   comSettings.Parity   = NOPARITY;
   comSettings.fParity  = FALSE;
   bStatus = SetCommState(comport, &comSettings);
   if (bStatus == 0)
   {
     std::wcout << L"\nsome error configuring communication settings\n";
     return 1;     // error processing code goes here
   }

   //send data
   bStatus = WriteFile(comport,         // Handle
                       &OUTBUFFER,      // Outgoing data
                       48,              // Number of bytes to write
                       &bytes_written,  // Number of bytes written
                       NULL);
   if (bStatus != 0)
   {
     std::wcout << L"\nsome error transmitting data\n";
     return 1;    // error processing code here
   }

   CloseHandle(comport);
return 0;
}

Edited by Sigma
Grammatik verbessert & Fehler im Code entfernt

Share this post


Link to post

Hallo Sigma,

 

danke für den Tipp, das Bsp sieht für mich, wie zu erwarten war, sehr kompliziert aus aber probieren geht über studieren. Du hast nicht zufällig schon eine Idee womit ich beginnen könnte, ist ein recht offenes Feld ;)

 

Danke und lg

Share this post


Link to post

Hallo,

 

das obige Beispiel ist ursprünglich von hier.

Die Version in meinem Beitrag sollte sich schon kompilieren lassen, z. B. mit Visual C++ und dem Windows SDK oder mit MinGW & gcc.

 

Wenn Du keine Fehlerbehandlung oder eine Steuerung über Parameter brauchst, kannst Du das Beispiel leicht an Dein Szenario anpassen.

 

Zwischen die Anführungszeichen kommt die Nachricht, die an den Beamer gehen soll.

char message[]="pwr on";

 

In der Zeile passt Du die Nummer des COM-Ports an, also anstelle COM5 den bei Dir verwendeten.

wchar_t portNumber[]=L"COM5";

 

In den Zeilen nach

// Set timeouts in milliseconds

 

und nach

// Set Port parameters.

trägst Du die Verbindungsparameter (BaudRate, Parity-Bit) ein.

 

Danach noch kompilieren lassen und hoffen, das es fehlerlos geht.

 

Grüße,

 

Sigma

Share this post


Link to post

Hi,

 

Das hört sich garnicht so schwer an, ma schauen ob ich das auf die Reiche kriege. Ich werde das Ergebnis hier posten wenn es soweit ist.

Vielen Dank schonmal für die Mühe :)

 

lg, Exec

Share this post


Link to post

Hallo,

 

Statusupdate:

Bin dabei das Script zu basteln, habe mich aber an einigen Problemen festgebissen, da ich seit 5 Jahren nichtmehr C++ angewendet habe auch keine Überraschung.

Soweit ich das erkennen kann ist der von dir gepostete Code in Visual C++ erstellt worden und ich benutze dummerweise Bloodshed, ich werde also erstmal einige Funktionen anpassen müssen und melde mich dann wieder.

 

lg, Exec

Share this post


Link to post

Da bin ich wieder,

 

ich habe nun ziemlich lange versucht mit C++ das Prog zum Laufen zu bringen ohne Erfolg, habe daraufhin meinem altem VB Script noch eine Chance gegeben. Es läuft nun damit, ich denke um das mit C++ zu realisieren hätte ich dann doch etwas tiefer wühlen müssen.

 

Nicht sehr sportlich das Problem damit einfach zu umgehen aber es funktioniert ;)

 

Nur für den Fall das jemand den Thread mal finden sollte und meine Lösung sehen möchte, ich habe in dem VB Script einfach die commands für Sendkey 3 mal wiederholt mit Pausen dazwischen. Das Problem war anscheinend das bei der ersten Eingabe es nicht so ankam wie es sollte. Ist zwar total stupide einfach mehrmals die commands reinzuhauen aber solange es klappt...

 

Danke trotzdem für die Hilfe, zumindest weiß ich jetzt das ich in C++ doch mal mehr reinschauen sollte.

 

lg, Exec

Share this post


Link to post
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte überlege Dir, ob es nicht sinnvoller ist ein neues Thema zu erstellen.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

Werbepartner:



×
×
  • Create New...