Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Programme ausführen, Win+R (https://www.delphipraxis.net/174075-programme-ausfuehren-win-r.html)

netpilots 2. Apr 2013 09:48

Programme ausführen, Win+R
 
Hallo Experten

Ich möchte die Box wie sie kommt wenn man die Windows Taste und 'R' drückt aus eine Programm genau so erscheinen lassen.
Habe schon den Explorer mit seinen Parametern und auch RunDLL32 untersucht aber noch nichts gefunden.
Wie macht man das softwaremässig? 'Normale' Programm ausführen lassen funktioniert mit ShellExecute super, geht das auch für mein Wunsch wie beschrieben?

Notfalls könnte man den Tastendruck 'WinTaste' und 'R' simulieren, oder? Wie würde das aussehen?

Nachtrag: Mit einem Trick habe ich es bereitsch geschafft. Kopierte den Link Ausführen als Run.lnk und führte diesen mit ShellExecute aus.
Bei Win7 x64 ist der Link hier: C:\Users\[Benutzername]\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Accessories
Wenn man in den Link schaut sieht man explorer -7003 u.s.w. was mich nicht weiter brachte.
Gibt es eine elegantere Lösung als mit dem Trick über den Link?


Vielen Dank und freundliche Grüsse - Netpilots

taveuni 2. Apr 2013 10:11

AW: Programme ausführen, Win+R
 
Vielleicht so?

mjustin 2. Apr 2013 10:13

AW: Programme ausführen, Win+R
 
Von der Kommandozeile aus geht es mit

c:\WINDOWS\system32\rundll32.exe shell32.dll,#61

Programmatisch get es mit IShellDispatch::FileRun laut How to open the Run window programmatically

netpilots 2. Apr 2013 13:57

AW: Programme ausführen, Win+R
 
Programmatisch geht es auch so wie beschrieben.

Code:
 ShellExecute(Handle,'open', PChar('rundll32.exe'), PChar('shell32.dll, #61'), nil, SW_SHOWNORMAL);
Die anderen Hinweise werde ich auch noch durchlesen. Ist halt Cpp welches ich für Delphi 6 ändern müsste.

netpilots 3. Apr 2013 14:13

AW: Programme ausführen, Win+R
 
Es ist wie verhext. Der Ursprung der Frage ('Ausführen' zu öffen), liegt darin, dass wenn ich Regedit vom Programm aus ausführe, dieses nicht gleich reagiert wie wenn man Regedit separat ausführt. Mein Programm wird mit Administratorenrechte ausgeführt. Diese Rechte werden scheinbar an die daraus gestarteten Programme vererbt. Regedit fragt nicht nochmals nach den Rechten.

Beispiel: Die Eintragungen in HK_LM\Software\Microsoft\Windows\CurrentVersion\OE MInformation (Selbstvertändlich ohne die Umleitung nach \WOW6432Node wie das bei x64 Systemen auomatisch geschehen würde) funktioniert. OEMInfos werden auch in den Eigenschaften angezeigt. Die Inhalte lassen sich programmatisch auslesen.

Nun möchte ich aber mit Regedit in die Registry rein schauen. Regedit programmatisch geöffnet erscheinen keine Einträge in \OEMInformation, auch WOW6432Node ist nicht vorhanden. Die Darstellung der Registry erscheint so wie bei 32 Bit Systemen. Selbst dort müssten aber Werte im \OEMInformation stehen.
Starte ich Regedit ausserhalb der Anwendung selbst wird alles so angezeigt wie erwartet. Starte ich Regedit programmatisch mit dem zuvor beschriebenen Link zeigt es auch alles an wie erwartet. Mit dem zuvor gestarteten Link werden die Rechte nicht an Regedit vererbt, es fragt also nochmals danach. Ich dachte dass der Link die Rechte Erbt und genau so auch das daraus gestartete Regedit.
Hauptproblem ist aber die unterschiedliche Darstellung der Inhalte der Registry, je nachdem wie, resp. von wem, Regedit gestartet wurde.
Wer hat schon solche Beobachtungen gemacht?

Dalai 3. Apr 2013 14:27

AW: Programme ausführen, Win+R
 
Schau mal im Taskmanager nach, welche Variante der regedit.exe wirklich - je nach Methode - gestartet wird.

MfG Dalai

netpilots 4. Apr 2013 01:22

AW: Programme ausführen, Win+R
 
Dein Hinweis ist was Wert, vielen Dank.
Wenn es nicht funktioniert ist es der regedit.exe *32 ; also der 32 Bit im C:\Windows\SysWOW64 Verzeichnis.
Wenn alles richtig angezeigt wird ist es der im C:\Windows Verzeichnis : also die 64 Bit Ausführung.
Jetzt werde ich explizit den 64 Bit ausführen. Schreibe dann ob es wirklich daran lag. Ich bin mir jetzt schon sicher dass es so ist aber testen muss ich ja trotzdem.

Ich schreibs gleich hier als Nachtrag rein.
Es hat noch nicht so funktioniert wie ich möchte.
Dies funktioniert:
Registry Einträge in der, sagen wir mal x64 Registry, bearbeiten geht mit der Einleitung.
Code:
Reg := TRegistry.Create(KEY_ALL_ACCESS OR KEY_WOW64_64KEY);
Regedit (x64) ausführen klappt nicht. Beide Beispiele öffnen das 32Bit Regedit.

So erwartete ich dass Regedit x64 ausgeführt wird, tut es aber nicht.
Code:
ShellExecute(Handle,'open', PChar('C:\Windows\Regedit.exe'), nil, nil, SW_SHOWNORMAL);
So erwartete ich dass Regedit x86 ausgeführt wird, tut es wie erwartet, nützt mir aber nichts.
Code:
ShellExecute(Handle,'open', PChar('C:\Windows\SysWOW64\Regedit.exe'), nil, nil, SW_SHOWNORMAL);

Ist da was zu machen, so wie einem das mit TRegistry.Create(KEY_ALL_ACCESS OR KEY_WOW64_64KEY) gelingt?

Dalai 4. Apr 2013 10:57

AW: Programme ausführen, Win+R
 
Auch wenn ich weiterhin nicht verstehe, warum du regedit.exe von deinem Programm aus starten können willst, ist das Starten von 64 Bit Programmen von 32 Bit Programmen aus etwas aufwendiger als der Zugriff auf die 64 Bit Registry-Zweige, Stichwort Wow64DisableWow64FsRedirection (hinterher das Wow64RevertWow64FsRedirection nicht vergessen!).

MfG Dalai

netpilots 4. Apr 2013 21:53

AW: Programme ausführen, Win+R
 
Man kann bestimmt vom Programm aus alles in der Registry machen was man auch mit Regedit machen kann. Dazu ist eigentlich kein Bedarf da.
Die ursprüngliche Idee war, mit Delphi Code was in der Registry machen und dann der Einfachheit halber mit Regedit kontrollieren. Damit man nicht 'Regedit' schreiben muss oder einen Link klickt sollte Regedit gleich vom Programm aus zu öffnen sein.

Jetzt wo klar wurde dass es nicht so einfach ist ein 64Bit Programm aus einer 32Bit Anwendung zu starten interessiert es erst recht.
Werde mal schauen ob ich mit deinem Hinweis weiter kommen.

Schon mal vielen Dank und liebe Grüsse - Netpilots

Die Lösung welche zu funktionieren scheint.

In der entsprechenden Unit, vor oder nach

'implementation'
'{$R *.dfm}'

diesen Code einfügen.

Code:
var Wow64FsEnableRedirection: LongBool;
Function Wow64DisableWow64FsRedirection(Var Wow64FsEnableRedirection: LongBool): LongBool; StdCall; External 'Kernel32.dll' Name 'Wow64DisableWow64FsRedirection';
Function Wow64RevertWow64FsRedirection(Wow64FsEnableRedirection: LongBool): LongBool; StdCall; External 'Kernel32.dll' Name 'Wow64RevertWow64FsRedirection';
Dann im Teil wo man ein x64 Programm (in unseren Fall regedit.exe) unter dieser 32Bit Anwendung starten möchte.
Code:
 if IsWOW64 then
  begin
   if Wow64DisableWow64FsRedirection(Wow64FsEnableRedirection) then
    begin
      ShellExecute(Handle,'open', PChar('Regedit.exe'), nil, nil, SW_SHOWNORMAL);
      Wow64RevertWow64FsRedirection(Wow64FsEnableRedirection);
    end;
  end;
Quelle welche für diesen Code verwendet wurde: http://embarcadero.newsgroups.archiv...007109312.html

Hätte noch Beispiele aus DelphiPraxis aber mit viel mehr Code: http://www.delphipraxis.net/155861-w...direction.html


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:30 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz