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:
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.
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