| Autor |
Beitrag |
Rool
      
Beiträge: 211
|
Verfasst: 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
      
Beiträge: 57
|
Verfasst: 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:
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',''); 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',''); reg.CloseKey;
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 UGrohne: BBCode aktiviert
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: 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?  Viel Spaß bei der Neuinstallation.
|
|
Unzi
      
Beiträge: 57
|
Verfasst: 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
|
Verfasst: 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 
      
Beiträge: 211
|
Verfasst: Di 10.06.03 10:02
Titel: ...
gibt es da keine einfache möglichkeit? irgendeinen prozess zu beenden ist ja ganz leicht,
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
      
Beiträge: 57
|
Verfasst: 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
      
Beiträge: 57
|
Verfasst: 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.
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); 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;
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)); end;
procedure TForm1.Button2Click(Sender: TObject); begin setshell('explorer.exe'); end; |
PS: Ich hab die alte Version ausprobiert, war Sch...
Unzi
Moderiert von Motzi: Code- durch Delphi-Tags ersetzt und BBCode aktiviert
|
|
Rool 
      
Beiträge: 211
|
Verfasst: 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
      
Beiträge: 57
|
Verfasst: 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:
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 Motzi: Code- durch Delphi-Tags ersetzt und BBCode aktiviert.
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Do 12.06.03 13:27
Nur ein Hinweis: Für HKLM sind Adminrechte zum Schreiben nötig. Hast du die?
|
|
Rool 
      
Beiträge: 211
|
Verfasst: 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
      
Beiträge: 57
|
Verfasst: 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
      
Beiträge: 189
|
Verfasst: 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 
      
Beiträge: 211
|
Verfasst: So 15.06.03 15:24
Titel: ..
ne, das funktioniert nur unter Win98 und ausserdem wird da auch der taskmanager gesperrt!
_________________ MFG Rool
|
|
DaFox
      
Beiträge: 189
|
Verfasst: So 15.06.03 18:57
Hi!
Unter Win98/ME:
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
      
Beiträge: 57
|
Verfasst: 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 
      
Beiträge: 211
|
Verfasst: Mo 16.06.03 15:19
Titel: ..
nene, die methode mit systemparametersinfo
_________________ MFG Rool
|
|
DaFox
      
Beiträge: 189
|
Verfasst: 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? 
|
|
Unzi
      
Beiträge: 57
|
Verfasst: Do 19.06.03 14:15
|
|