Entwickler-Ecke
Sonstiges (.NET) - Problem mit automatischem Zugriff über .scr
Bertel1344 - Mo 22.11.10 17:19
Titel: Problem mit automatischem Zugriff über .scr
Hallo Zusammen
Ich habe ein Problem, dass ich nicht verstehe.
Ein Programm, das ich geschrieben habe funktioniert völlig normal, wenn ich es manuell öffne.
Wenn dieses Programm jedoch per Batch-File oder über den Screensaver-Aufruf gestartet werden soll, passiert entweder nichts, oder das Fenster des Programms erscheint nur kurz.
Vielleicht gibt es auch einen Weg dieses Problem komplett zu umgehen, darum hier noch ein kurzer Überblick des Projekts.
Das Endprodukt soll ein Kiosk-Rechner sein, der es Personen erlauben sollte im firmeneigenen Intranet zu browsen (plus einige Seiten per Whitelisting). Dazu müssen sie nur ihren Badge (RFID-Transponder) an einen Legic-Leser halten. Der Badge wird dann vom Programm (das selber geschriebene) ausgelesen, sprich nur das Kaba-benzing-Segment.
Das Programm startet mit dem Rechner, ich habe in den Policies die Explorer-Shell mit meinem Programm ausgetauscht, damit schon einmal gewisse Funktionen und Möglichkeiten unterbunden werden (Explorer.exe). Wenn nun der Badge an den Leser gehalten wird, startet der Internet Explorer 8 und ein selber erstelltes OnScreenKeyboard (TouchIt) (nicht selber gecoded, sondern durch Chessware ermöglicht).
Soweit funktioniert alles.
Anschliessend wird per Screensaver-Aufruf (Key in der Registry / GP) eine Applikation gestartet, welche den IE8 und das OSK beendet (das funktioniert auch noch)
Nun soll wieder die Badgeleser-Applikation gestartet werden. Das ist der Punkt, an dem bisher alles schief gelaufen ist.
Ich habe es zwar mittlerweile soweit gebracht, dass die Badgeleser-Applikation gestartet wird, aber sie wird einfach geschlossen wenn ein Bagde an den Leser gehalten wird, ohne dass der IE8 und das OSK starten. Bevor ich diesen Beitrag verfasst habe, habe ich es erst bei Google / Yahoo / Bing und anschliessend direkt hier im Forum (und in diversen anderen Foren) mit der Suchfunktion versucht.
Leider hatte ich damit bislang keinen Erfolg.
EDIT: Die Applikation, die den IE8 und das OSK beenden und die Badgeleser-Applikation starten soll, sollte sich nach vollführen dieser Aufgaben selber schliessen (durch Application.Exit();). Jedoch schliesst sich die Applikation nicht selber und so versuche ich, sie durch die Badgeleser-Applikation zu beenden. Was wahrscheinlich darin resultiert, dass beide beendet werden... Kann mir vielleicht noch jemand sagen wieso das passiert, wenn die Applikation über den Screensaver-Aufruf gestartet wird, und wieso alles wunderbar funktoniert, wenn ich es manuell starte?
Gruss Bertel1344
jaenicke - Mo 22.11.10 18:01
Hallo und :welcome:
Kann es sein, dass du irgendwelchen relativen Pfade benutzt, die dann natürlich ggf. nicht gefunden werden?
Ansonsten lässt sich ohne etwas Code oder einer genaueren beschreibung was du da alles machst kaum etwas dazu sagen. :nixweiss:
Bertel1344 - Do 25.11.10 10:39
Also Danke erst einmal für die Antwort.
Nein, ich benutze nur absolute Pfade.
Stimmt, das habe ich völlig vergessen...
Also, beim Systemstart wird erst diese Applikation (BadgeControl) ausgeführt:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177: 178: 179: 180: 181: 182: 183: 184: 185:
| using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms;
using System.IO; using System.IO.Ports; using System.Threading; using System.Collections; using System.Diagnostics;
namespace BadgeControl { public partial class MainBadgeControl : Form { #region INSTANCES
public MainBadgeControl() { InitializeComponent();
CheckFile(); InitializeComPort(); }
bool bFileExist = true; string sData; string sTimeStamp; string sDateStamp; string sFilePath = "C:\\Kiosk_PC\\Logs\\"; string sStartBat = "C:\\Kiosk_PC\\KioskStart.bat"; SerialPort sp = new SerialPort();
#endregion
#region METHODS
private void KillReset() { foreach (Process pProcess in Process.GetProcesses()) { if (pProcess.ProcessName.StartsWith("KioskReset")) { pProcess.Kill(); } } }
private void InitializeComPort() { try { sp = new SerialPort("COM3", 9600, Parity.None, 8, StopBits.One); sp.Open(); } catch { try { sp = new SerialPort("COM4", 9600, Parity.None, 8, StopBits.One); sp.Open(); } catch { MessageBox.Show("Cannot initialize COM-Port 3 and 4", "COM-Port Error"); } } finally { sp.DataReceived += new SerialDataReceivedEventHandler(sp_DataReceived); } }
private void CheckFile() { sDateStamp = DateTime.Now.ToString("yyyy.MM.dd"); if (!File.Exists(sFilePath + sDateStamp + "_BadgeReaderLog.txt")) { bFileExist = false; } }
private void WriteFile(string sPart) { sTimeStamp = DateTime.Now.ToString("yyyy.MM.dd HH:mm:ss"); try { if (bFileExist == true) { StreamWriter swLog = new StreamWriter(sFilePath + sDateStamp + "_BadgeReaderLog.txt", true); swLog.WriteLine(sTimeStamp + "\t" + sData); swLog.Close(); } else { FileStream fsLog = new FileStream(sFilePath + sDateStamp + "_BadgeReaderLog.txt", FileMode.Create, FileAccess.Write, FileShare.ReadWrite); StreamWriter swLog = new StreamWriter(fsLog); swLog.WriteLine(sTimeStamp + "\t" + sData); swLog.Close(); fsLog.Close(); } } catch (Exception ee) { MessageBox.Show(ee.Message, "File Error"); } }
#endregion
#region EVENTS
private void sp_DataReceived(object sender, SerialDataReceivedEventArgs e) { string sRawData = sp.ReadLine(); if (sRawData.Length > 0) { sData = Convert.ToString(sRawData).Substring(9, 5); WriteFile(sData);
try { Process.Start(sStartBat); } catch (Exception ee) { MessageBox.Show(ee.Message, "KioskStart.bat is missing"); }
KillReset();
Application.Exit(); } }
#endregion } } |
Wenn nun der Badge an den Leser gehalten und der Kaba-Benzing-Datensatz protokolliert wurde, werden IE8 und das OSK gestartet.
Der Benutzer kann nun im firmeneigenen Intranet browsen und auch die firmeneigene Website besuchen.
Nach 30 Sekunden (diese Zeit wird wahrscheinlich noch angepasst) Inaktivität wird die Applikation "KioskReset" aufgerufen.
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86:
| using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms;
using System.IO; using System.IO.Ports; using System.Threading; using System.Collections; using System.Diagnostics;
namespace KioskReset { public partial class KioskReset : Form { #region INSTANCES
public KioskReset() { InitializeComponent();
try { KillProcess("iexplore"); KillProcess("TouchIt"); } catch (Exception ee) { MessageBox.Show(ee.Message, "ProzessFehler"); }
if (FindProcess("BadgeControl")) { Process.Start("C:\\WINDOWS\\system32\\logon.scr"); } else { Process.Start("C:\\Kiosk_PC\\BadgeControl.exe"); }
Application.Exit(); }
#endregion
#region METHODS
private void KillProcess(string pProcessName) { foreach (Process pProcess in Process.GetProcesses()) { if (pProcess.ProcessName.Equals(pProcessName)) { pProcess.Kill(); } } }
private bool FindProcess(string pProcessName) { foreach (Process pProcess in Process.GetProcesses()) { if (pProcess.ProcessName.Equals(pProcessName)) { return true; } } return false; }
#endregion
} } |
Nun sollten erst IE und OSK beendet, BadgeControl gestartet und wiederum KioskReset beendet werden.
Das Problem ist nun, dass KioskReset sich nicht selber beendet.
Ich hatte den Code auch schon so umgeschrieben (mit "Process.GetCurrentProcess().Kill();"), dass sich KioskReset eben selbst beenden kann, obwohl es sich eigentlich durch "Application.Exit();" schon selber hätte beenden sollen.
Wenn das Programm (KioskReset) sich jedoch selber schliesst, werden auch das aufgerufene BadgeControl und der Screensaver beendet.
Nun ist das Problem eben, dass BadgeControl aktiv bleiben soll während KioskReset sich selber schliessen soll.
Das BatchFile KioskStart.bat enthält folgenden Code:
Quelltext
1: 2: 3: 4: 5: 6:
| @ECHO OFF
START "" "C:\program Files\Internet Explorer\iexplore.exe" -k START "" "C:\Program Files\Chessware\TouchIt\TouchIt.exe"
EXIT |
Ich habe auch schon versucht, KioskReset so umzuschreiben, dass es ein BatchFile startet, dass anschliessend seine Funktionen ausführen soll. Doch auch das hat zum gleichen Resultat geführt.
Das alternative BatchFile KioskReset.bat enthält folgenden Code:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21:
| @ECHO OFF
TASKLIST /FI "IMAGENAME eq iexplore.exe" 2>NUL | FIND /I /N "iexplore.exe">NUL IF "%ERRORLEVEL%"=="0" ( TASKKILL /F /IM iexplore.exe )
TASKLIST /FI "IMAGENAME eq TouchIt.exe" 2>NUL | FIND /I /N "TouchIt.exe">NUL IF "%ERRORLEVEL%"=="0" ( TASKKILL /F /IM TouchIt.exe )
TASKLIST /FI "IMAGENAME eq BadgeControl.exe" 2>NUL | FIND /I /N "BadgeControl.exe">NUL IF "%ERRORLEVEL%"=="0" ( CALL "C:\WINDOWS\system32\logon.scr" /s ) ELSE ( START "BCS" "C:\Kiosk_PC\BadgeControl.exe" )
EXIT |
Noch eine Frage, welcher befehl ist geschickter für den Aufruf von eigenständigen Applikationen, CALL oder START?
Gruss Bertel1344
Bertel1344 - Do 02.12.10 09:19
Hallo zusammen
Ich konnte das Problem auf diesem Weg leider immer noch nicht lösen.
Nun versuche ich es auf eine andere Weise, indem ich die BadgeControl-App. im Hintergrund offen halte, solange der Badge an den Badgeleser gehalten wird. Somit kann der Benutzer den Rechner nur bedienen solange dieser Status aufrecht erhalten wird. Sobald der Badge entfernt wird, werden auch alle Applikationen geschlossen, ausser BadgeControl, dass theoretisch ewig laufen würde (nächtlicher Neustart der Station).
Die Frage wäre soweit geschlossen, jedoch nicht beantwortet.
Gruss
Bertel1344
Ps. Ich bin noch ziemlich unerfahren in der Forennutzung, wie kann ich dieses Thema schliessen?
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!