Autor Beitrag
Rool
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 211



BeitragVerfasst: Mo 09.06.03 11:17 
Wie kann ich den Explorer "legal" beenden, also nicht so abwürgen, dass er sich neu startet...
Sowie als würde man Start->Beenden und dann mit Strg+Shift+Alt abbrechen drücken! (Oder unter WinXP den Prozess beenden...)

_________________
MFG Rool
Unzi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 57



BeitragVerfasst: Mo 09.06.03 14:25 
Am besten du setzt den Explorer als Shell und startest dann das System neu. Das könnte ungefähr so gehen:
ausblenden volle Höhe Delphi-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:
uses dialogs,inifiles,registry,windows,;
...
procedure SetShell;
var inifile:TInifile;
reg:TRegistry;
windir:array[0..MAX_PATH] of char;
whichversion:string;
i:integer;
begin
whichversion:=inputbox('Windows-Version',
'Geben Sie hier 9x für Windows 95/98/Me'
+#10#13+
'und NT für Windows NT4/2000/XP ein:','');

for i:=1 to length(whichversion) do 
whichversion[i]:=upcase(whichversion[i]);

if whichversion='9X' then begin
GetWindowsDirectory(windir,MAX_PATH);
inifile:=tinifile.Create(windir+'\system.ini');;
inifile.WriteString('boot','shell','');  //Exitstiert nicht
inifile.Free;
exitwindowsex(EWX_REBOOT,0);
end;
if whichversion='NT' then begin
reg:=TRegistry.Create;
reg.RootKey:=HKEY_CURRENT_USER;
if reg.OpenKey(
'Software\Microsoft\Windows NT\Current Version\Winlogon',false) then
reg.WriteString('Shell','');  //Exitstiert nicht
reg.CloseKey;

//Damit der Explorer-Aufruf nicht die ganze Shell lädt:
reg.RootKey:=HKEY_LOCAL_MACHINE;
if reg.OpenKey(
'Software\Microsoft\Windows NT\Current '+ 'Version\IniFileMapping\system.ini\boot',false) then
reg.WriteString('Shell',
'USR:Software\Microsoft\Windows NT\Current Version\Winlogon');
reg.CloseKey;
reg.Free;
exitwindowsex(EWX_REBOOT,0);
end;
end;


Probiers mal und sag mir bitte bescheid ob's geklappt hat!

Unzi

Moderiert von user profile iconUGrohne: BBCode aktiviert
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 09.06.03 16:39 
Das ist aber sehr fragwürdiger Code.

Erstens:
kannman sehr leicht selber mit GetVersionEx rausfinden was für ein OS läuft.
Zweitens:
Mit Uppercase kann man gleich den ganzen String in Großbuchstaben konvertieren.
Drittens:
Spätesten hier: exitwindowsex(EWX_REBOOT,0); dürftest du bei NT-basierenden System auf die Nase fallen, da du dir vorher nicht die nötigen Rechte holst.

Und wenn ich das richtig gesehen habe, ersetzt du die Shell durch nichts oder wie? :shock: Viel Spaß bei der Neuinstallation.
Unzi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 57



BeitragVerfasst: Di 10.06.03 08:25 
Erstens: Wusste ich nicht, dass es eine Funktion 'GetVersionEx' gibt, danke für den Tip.
Zweitens: Uppercase kannte ich auch noch nicht, danke für den Tip.
Drittens: Ich besitze kein NT-System, du könntest mir allerdings sagen, wie man sich die Rechte dafür holen kann.
Viertens: Die Shell kann man ganz einfach OHNE Neuinstallation wieder einsetzen:
1.NT: Unter Strg+Alt+Entf auf Task starten/Regedit.exe gehen, den besagten Wert auf Explorer.exe setzen
2. 9x: Im MS-DOS-Modus starten (F8 sofort nach Systemstart drücken), edit <windows-verzeichnis>\system\system.ini eingeben und enter drücken, unter boot shell=explorer.exe eintragen.
Tschüs!
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Di 10.06.03 08:45 
Unzi hat folgendes geschrieben:
Drittens: Ich besitze kein NT-System, du könntest mir allerdings sagen, wie man sich die Rechte dafür holen kann.

Du könntest die Suchfunktion benutzen oder in den WinAPI-FAQs nachschauen.
Rool Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 211



BeitragVerfasst: Di 10.06.03 10:02 
Titel: ...
gibt es da keine einfache möglichkeit? irgendeinen prozess zu beenden ist ja ganz leicht,
ausblenden Quelltext
1:
2:
SendMessage(hwnd, WM_CLOSE, 0, 0) 
SendNotifyMessage(hwnd, WM_SYSCOMMAND, SC_CLOSE, 0)


aber ich bekomm das handle vom exploror leider nicht...[

_________________
MFG Rool
Unzi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 57



BeitragVerfasst: Di 10.06.03 12:44 
Einen Handle zu bekommen ist prinzipiell leicht:

var handle:Thandle;
begin
handle:=FindWindow(<klassenname>,'Explorer');
end;

Das Problem dabei ist, ich weiß nicht, wie die Fensterklasse des Explorers heißt.
Unzi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 57



BeitragVerfasst: Di 10.06.03 13:36 
Hallo, ich hab eine neue, bessere Version des Programms geschrieben. Button 1 setzt dieses Programm als Shell, Button 2 den Explorer.

ausblenden volle Höhe Delphi-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:
function shortpath(longname:string):string;
var buf:array[0..max_path] of char;
begin
GetShortPathName(pchar(longname),buf,MAX_PATH);
result:=buf;
end;

procedure setshell(prgname:string);
var inifile:TInifile;
reg:TRegistry;
windir:array[0..MAX_PATH] of char;
whichversion:string;
begin
whichversion:=inputbox('Windws-Version','Geben Sie 9x für Windows 95/98/Me oder NT für Windows NT4/2000/XP ein:','');
whichversion:=uppercase(whichversion);
if whichversion='9X' then begin
GetWindowsDirectory(windir,MAX_PATH);
inifile:=tinifile.Create(windir+'\system.ini');;
inifile.WriteString('boot','shell',prgname);
inifile.WriteString('boot','run',application.ExeName);  //Programm wird gestartet und kann Shell zur Not zurücksetzen
inifile.Free;
end;
if  whichversion='NT' then begin
reg:=TRegistry.Create;
reg.RootKey:=HKEY_CURRENT_USER;
if reg.OpenKey('Software\Microsoft\Windows NT\Current Version\Winlogon',false) then
reg.WriteString('Shell',prgname);
reg.CloseKey;

//Damit der Explorer-Aufruf nicht die ganze Shell lädt:
reg.RootKey:=HKEY_LOCAL_MACHINE;
if reg.OpenKey('Software\Microsoft\Windows NT\Current Version\IniFileMapping\system.ini\boot',false) then
reg.WriteString('Shell','USR:Software\Microsoft\Windows NT\Current Version\Winlogon');
reg.CloseKey;
reg.Free;
end;
messagebox(application.handle,'Bitte starten Sie nun ihr System neu.','Neustart',0);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
setshell(shortpath(application.ExeName)); //Setze diese Datei als Shell, damit Shell widerhergestellt werden kann
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
setshell('explorer.exe');
end;


PS: Ich hab die alte Version ausprobiert, war Sch...

Unzi

Moderiert von user profile iconMotzi: Code- durch Delphi-Tags ersetzt und BBCode aktiviert
Rool Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 211



BeitragVerfasst: Di 10.06.03 13:51 
Titel: ...
danke für deine mühe, aber da passiert absolut NICHTS! der explorer wid normal gestartet und mein prog nicht! was sollte denn genau passieren? (ich hab XP...)

_________________
MFG Rool
Unzi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 57



BeitragVerfasst: Do 12.06.03 13:25 
Passiert nichts? Dann kümmer dich mal um den unteren Teil. Er ist für Betriebssysteme der NT-Reihe ausgelegt und greift auf die Registry zu. Du kannst diese Einstellung auch global setzen (wofür du aber bestimmt Admin-Rechte brauchst). Dann hieße der Code so:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
if  whichversion='NT' then begin
reg:=TRegistry.Create;
reg.RootKey:=HKEY_LOCAL_MACHINE;
if reg.OpenKey('Software\Microsoft\Windows NT\Current Version\Winlogon',false) then
reg.WriteString('Shell',prgname);
reg.CloseKey;
end;

reg.RootKey:=HKEY_LOCAL_MACHINE;
if reg.OpenKey('Software\Microsoft\Windows NT\Current Version\IniFileMapping\system.ini\boot',false) then
reg.WriteString('Shell','SYS:Software\Microsoft\Windows NT\Current Version\Winlogon');
reg.CloseKey;
reg.Free;

Der Code soll das Programm, also sich, und nicht den Explorer als Shell setzen, und diese Einstellung später rückgängig machen. Du könntest Button1Click und Button2Click auch integrieren. Die sollen nur der Demonstration dienen.

Moderiert von user profile iconMotzi: Code- durch Delphi-Tags ersetzt und BBCode aktiviert.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 12.06.03 13:27 
Nur ein Hinweis: Für HKLM sind Adminrechte zum Schreiben nötig. Hast du die?
Rool Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 211



BeitragVerfasst: Do 12.06.03 14:14 
Titel: ..
probier ich gleich mal aus.. also admin rechte hab ich!
aber an sich reicht es ja aus ihn nur zu beenden, wenn das programm läuft!

_________________
MFG Rool
Unzi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 57



BeitragVerfasst: Fr 13.06.03 13:23 
Falls es nicht geht: schreib mal den Schlüssel so:
reg.openkey('Software\Microsoft\Windows\CurrentVersion\Winlogon');

Unzi
DaFox
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 189



BeitragVerfasst: Fr 13.06.03 15:10 
Hi!

Nach der Lösung welchen Problems wird in diesem "Trial'n'Error'-Thread eigentlich gesucht? Den Explorer aus Spaß abzuschießen kann es ja nicht sein.

Vielleicht sucht man nach dem hier:
msdn.microsoft.com/l...ef/htm/apc_msg_5.asp

Gruß,
Markus
Rool Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 211



BeitragVerfasst: So 15.06.03 15:24 
Titel: ..
ne, das funktioniert nur unter Win98 und ausserdem wird da auch der taskmanager gesperrt!

_________________
MFG Rool
DaFox
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 189



BeitragVerfasst: So 15.06.03 18:57 
Hi!

Unter Win98/ME:
ausblenden Quelltext
1:
RUNDLL32.EXE shell32,SHExitWindowsEx -1					


Ansonsten: Mal ein bisschen Reverse Engineering betreiben, wie das Windows im Falle des offiziellen Weg macht.
Offizieller Weg: Start -> Beenden -> Herunterfahren muss ausgewählt sein -> Ctrl+Alt+Shift und Abbrechen Button drücken. Danach explorer.exe neustarten (z.B. durch Task Manager).

Habe mich allerdings wegen Zeitmangels darum noch nie kümmern können.

Gruß,
Markus
Unzi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 57



BeitragVerfasst: Mo 16.06.03 14:50 
So wollte Rool es nun gerade nicht machen. Er wollte diese Schritte sein Programm erledigen lassen.

@rool: was funktioniert nur unter 98 und deaktiviert den Taskmanager? Etwa mein Programm?
Rool Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 211



BeitragVerfasst: Mo 16.06.03 15:19 
Titel: ..
nene, die methode mit systemparametersinfo

_________________
MFG Rool
DaFox
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 189



BeitragVerfasst: Mo 16.06.03 18:04 
Unzi hat folgendes geschrieben:

So wollte Rool es nun gerade nicht machen. Er wollte diese Schritte sein Programm erledigen lassen.


Ist das eine Antwort auf mein Posting? :roll:
Unzi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 57



BeitragVerfasst: Do 19.06.03 14:15 
Ja.

Gruß! Unzi