Autor Beitrag
Bertel1344
Hält's aus hier
Beiträge: 3

Win XP prof., Win Vista, SuSe 10
C# (VS 2008), Java
BeitragVerfasst: Mo 22.11.10 17:19 
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19341
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 3

Win XP prof., Win Vista, SuSe 10
C# (VS 2008), Java
BeitragVerfasst: 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:

ausblenden volle Höhe 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

            // initialize the form and the ComPort as well as check if the LogFile is existing
            public MainBadgeControl()
            {
                InitializeComponent();

                CheckFile();
                InitializeComPort();
            }

            // create the FileExistence-Validator-Boolean
            bool bFileExist = true;
            // create the Data-String
            string sData;
            // create the TimeStamp-String
            string sTimeStamp;
            // create the DateStamp-String
            string sDateStamp;
            // create Path-Strings
            string sFilePath = "C:\\Kiosk_PC\\Logs\\";
            string sStartBat = "C:\\Kiosk_PC\\KioskStart.bat";
            // create a Serial Port object
            SerialPort sp = new SerialPort();

        #endregion

        #region METHODS

            // kill KioskRestart if it's open
            private void KillReset()
            {
                // kill every process that starts with the specified name
                foreach (Process pProcess in Process.GetProcesses())
                {
                    // the specified name is KioskReset, so every process (.exe / .scr) will be killed
                    if (pProcess.ProcessName.StartsWith("KioskReset"))
                    {
                        // finally kill the process
                        pProcess.Kill();
                    }
                }
            }

            // initialize a free COM-Port (3 or 4)
            private void InitializeComPort()
            {
                // First Try (COM3)
                try
                {
                    // set the parameters
                    sp = new SerialPort("COM3"9600, Parity.None, 8, StopBits.One);
                    // open the COM port
                    sp.Open();
                }
                catch
                {
                    // Second Try (COM4)
                    try
                    {
                        // set the parameters
                        sp = new SerialPort("COM4"9600, Parity.None, 8, StopBits.One);
                        // open the COM port
                        sp.Open();
                    }
                    catch
                    {
                        // ErrorMessage
                        MessageBox.Show("Cannot initialize COM-Port 3 and 4""COM-Port Error");
                    }
                }
                finally
                {
                    // bind event to port
                    sp.DataReceived += new SerialDataReceivedEventHandler(sp_DataReceived);
                }
            }

            // check if the LogFile and its folder are existant
            private void CheckFile()
            {
                // get the actual date for the LogFile
                sDateStamp = DateTime.Now.ToString("yyyy.MM.dd");
                if (!File.Exists(sFilePath + sDateStamp + "_BadgeReaderLog.txt"))
                {
                    // save the state (existence) of the file
                    bFileExist = false;
                }
            }

            // create and / or write the LogData into the LogFile
            private void WriteFile(string sPart)
            {
                // get the actual time for the LogFile
                sTimeStamp = DateTime.Now.ToString("yyyy.MM.dd HH:mm:ss");
                try
                {
                    // if the file already exists, write into it
                    if (bFileExist == true)
                    {
                        // create streamwriter
                        StreamWriter swLog = new StreamWriter(sFilePath + sDateStamp + "_BadgeReaderLog.txt"true);
                        // write the LogData into the file
                        swLog.WriteLine(sTimeStamp + "\t" + sData);
                        // close streamwriter
                        swLog.Close();
                    }
                    // if the file doesn't exist, create it and then write into it
                    else
                    {
                        // create filestream and streamwriter
                        FileStream fsLog = new FileStream(sFilePath + sDateStamp + "_BadgeReaderLog.txt", FileMode.Create, FileAccess.Write, FileShare.ReadWrite);
                        StreamWriter swLog = new StreamWriter(fsLog);
                        // write the LogData into the file
                        swLog.WriteLine(sTimeStamp + "\t" + sData);
                        // close filestream and streamwriter
                        swLog.Close();
                        fsLog.Close();
                    }
                }
                // ErrorMessage
                catch (Exception ee)
                {
                    MessageBox.Show(ee.Message, "File Error");
                }
            }

        #endregion

        #region EVENTS

            // this Event will be casted if any Data arrives at the COM-Buffer
            // afterwards the Data will be saved
            private void sp_DataReceived(object sender, SerialDataReceivedEventArgs e)
            {
                // read all the data waiting in the buffer (should just be a single string)
                string sRawData = sp.ReadLine();
                // check if sRawData is empty
                if (sRawData.Length > 0)
                {
                    // convert and trim the InputData
                    sData = Convert.ToString(sRawData).Substring(95);
                    // write the InputData into the LogFile (+ line break)
                    WriteFile(sData);

                    // start the BatchFile "KioskStart.bat"
                    try
                    {
                        Process.Start(sStartBat);
                    }
                    catch (Exception ee)
                    {
                        MessageBox.Show(ee.Message, "KioskStart.bat is missing");
                    }

                    // kill KioskReset if it's open
                    KillReset();

                    // close the BadgeControl
                    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.

ausblenden volle Höhe 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 to kill IE and the OSK
                try
                {
                    KillProcess("iexplore");
                    KillProcess("TouchIt");
                }
                catch (Exception ee)
                {
                    MessageBox.Show(ee.Message, "ProzessFehler");
                }

                // start the Screensaver if BadgeControl is running, else start BadgeControl
                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)
            {
                // kill every process that starts with the specified name
                foreach (Process pProcess in Process.GetProcesses())
                {
                    // the specified name is KioskReset, so every process (.exe / .scr) will be killed
                    if (pProcess.ProcessName.Equals(pProcessName))
                    {
                        // finally kill the process
                        pProcess.Kill();
                    }
                }
            }

            private bool FindProcess(string pProcessName)
            {
                // Find any process that starts with the specified name
                foreach (Process pProcess in Process.GetProcesses())
                {
                    if (pProcess.ProcessName.Equals(pProcessName))
                    {
                        // finally return true if the process was found
                        return true;
                    }
                }
                // else return false
                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:
ausblenden 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:
ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 3

Win XP prof., Win Vista, SuSe 10
C# (VS 2008), Java
BeitragVerfasst: 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?