Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   DisplaySwitch über ShellExecute oder WinExec funktioniert nicht (https://www.delphipraxis.net/203235-displayswitch-ueber-shellexecute-oder-winexec-funktioniert-nicht.html)

martinwk 27. Jan 2020 14:24

Delphi-Version: XE7

DisplaySwitch über ShellExecute oder WinExec funktioniert nicht
 
DisplaySwitch.exe (Dienstprogramm in system32) gestattet die Umschaltung internes/externes Display über die Kommandozeile:
DisplaySwitch /internal
oder
DisplaySwitch /external
Man kann auch aus der Zeile ein Batchprogramm machen, dieses aufrufen: Funktioniert.
Auch ein Link auf das Batchprogramm funktioniert.

Rufe ich aber DisplaySwitch.exe mit dem jeweiligen Parameter via ShellExecute oder WinExec auf, passiert nichts.
Ebenso, wenn ich cmd.exe als auszuführendes Programm angebe mit "/c DisplaySwitch /external" als Parameter. Dann blinkt nur kurz die Konsole auf.

So etwas habe ich noch nie erlebt, habe bis dato unzählige Programme, Batchdateien, auch Links, problemlos via ShellExecute aufgerufen.

mkinzler 27. Jan 2020 14:32

AW: DisplaySwitch über ShellExecute oder WinExec funktioniert nicht
 
Möglichweise benötigt der Aufruf erhöhte Rechte.

hoika 27. Jan 2020 14:34

AW: DisplaySwitch über ShellExecute oder WinExec funktioniert nicht
 
Hallo,
welcher Fehlercode? Vielleicht sagt auf GetLastError was.
Geht es prinzipiell nicht, oder nur auf deinem Rechner?

KodeZwerg 27. Jan 2020 14:36

AW: DisplaySwitch über ShellExecute oder WinExec funktioniert nicht
 
Frage: Wird das Prgramm aufgerufen wenn Du die Batch Datei anstelle der .exe aufrufst? (.bat/.cmd in Dein Projekt Verzeichniss kopieren damit der absolute Pfad keine Probleme darstellt)

Der schöne Günther 27. Jan 2020 14:41

AW: DisplaySwitch über ShellExecute oder WinExec funktioniert nicht
 
Ein bisschen Code wäre nicht schlecht. Dann sähe man auch wie es sich z.B. mit übergebenen Fensterhandles (HWND) verhält...

HolgerX 27. Jan 2020 15:34

AW: DisplaySwitch über ShellExecute oder WinExec funktioniert nicht
 
Hmm..

Setze mal einfach 'cmd.exe /A /C ' vor deinen Aufruf.

also:

Code:
cmd.exe /A /C DisplaySwitch /internal
Manche Batch-Befehle laufen nur in der CMD...

himitsu 27. Jan 2020 16:31

AW: DisplaySwitch über ShellExecute oder WinExec funktioniert nicht
 
Ohne cmd.exe bekommt er den Fehlercode von der DisplaySwitch.exe, anstatt dem von der cmd.exe.

fehlende Suchpfade, wenn/da ohne Pfadeangabe?
wenn mit, dann vielleicht falscher Pfad?
usw.

Also ja, ein bissl Code kann nie schaden, damit jemand dort eventuelle Fehler bemerken könnte,
und für dich gilt: Rückgabewerte prüfen, damit du erfährts warum es nicht geht. (Datei nicht gefunden, falsche Parameter, Programmfehler, ...)
siehe ERRORLEVEL, bzw. hier Result dieser WinAPI und GetLastError (jenachdem was in der Doku dieser WinAPI steht)


Und dieses WinExec solltest du auch gleich endlich mal vergessen, da diese API schon seit Jahrzehnten veraltet ist.
neu: ShellExecute, CreateProcess und deren Verwandte.

hoika 27. Jan 2020 17:05

AW: DisplaySwitch über ShellExecute oder WinExec funktioniert nicht
 
Hallo,
als Fehler kommt "File not found".

Es hat vielleicht damit zu tun, dass du als 32-Bit-Programm (?) eine 64-Bit-Programm starten willst,
oder der Ansatz über cmd geht nicht, wegen siehe hier

https://www.herber.de/forum/archiv/1...t.html#1575549

Wow64EnableWow64FsRedirection benutzten hilft vielleicht.


Ich würde aber erst mal zur Bat-Datei greifen, das klappt auf jeden Fall.
ShellExecute(Handle, nil, 'c:\temp\Display.bat', '', '', SW_ShowNormal);

himitsu 27. Jan 2020 17:16

AW: DisplaySwitch über ShellExecute oder WinExec funktioniert nicht
 
Ohhh, das ist ja nett.

Aber dann wäre auch eine Lösung, dass er sein Programm als 64 Bit compiliert. :stupid:




Alternativ könnte man auch direkt die WinAPI nutzen, welche diese Anwendung verwendet,
vermutlich wirgendwas in Richtung MSDN-Library durchsuchenChangeDisplaySettings.

Dalai 27. Jan 2020 17:27

AW: DisplaySwitch über ShellExecute oder WinExec funktioniert nicht
 
DisplaySwitch.exe gibt's im Windows 10 nur noch im %SystemRoot%\System32. Bei älteren Windows-Versionen (7 und 8.1) liegt zusätzlich eine 32-bit-Version in %SystemRoot%\SysWOW64. Falls du Windows 10 und ein 32-bit-Delphi-Programm verwendest, müsstest du daher %SystemRoot%\SysNative\DisplaySwitch.exe statt %SystemRoot%\system32\DisplaySwitch.exe aufrufen. Oder eben wie himitsu bereits sagte, dein Programm als x64 kompilieren.

Grüße
Dalai

hoika 27. Jan 2020 17:30

AW: DisplaySwitch über ShellExecute oder WinExec funktioniert nicht
 
Hallo,
%SystemRoot%\SysNative\DisplaySwitch.exe

unter 32bit immer noch
file not found

Dalai 27. Jan 2020 17:47

AW: DisplaySwitch über ShellExecute oder WinExec funktioniert nicht
 
Naja, die Umgebungsvariable(n) musst du vorher wahrscheinlich schon auflösen (MSDN-Library durchsuchenExpandEnvironmentStrings).

Grüße
Dalai

martinwk 27. Jan 2020 21:50

AW: DisplaySwitch über ShellExecute oder WinExec funktioniert nicht
 
Besten Dank für die vielen Tipps. Es funktioniert jetzt!
Aber nur in der folgenden Form, als 64-bit Programm compiliert:
ShellExecute(Handle, 'open', PChar('DisplaySwitch.exe'), PChar('/external'), nil, SW_HIDE);
Es funktioniert nicht mit der Pfadangabe: %SystemRoot%\SysNative\DisplaySwitch.exe, auch nicht, wenn ich DisplaySwitch über eine Batch-Datei aufrufe.

Dalai 27. Jan 2020 22:10

AW: DisplaySwitch über ShellExecute oder WinExec funktioniert nicht
 
Also eine Batchdatei wie
Code:
@echo off
set DS=%SystemRoot%\System32\DisplaySwitch.exe
if exist %SystemRoot%\SysNative\*.exe set DS=%SystemRoot%\SysNative\DisplaySwitch.exe
"%DS%"
funktioniert garantiert.

Und wie gesagt: Umgebungsvariablen müssen sehr wahrscheinlich schon aufgelöst an ShellExecute(Ex) übergeben werden. Die CMD macht das selbst und daher funktioniert das dort ohne weitere Maßnahmen. Alternativ zu MSDN-Library durchsuchenExpandEnvironmentStrings kann man auch MSDN-Library durchsuchenGetWindowsDirectory benutzen, und den restlichen Pfad 'SysNative\DisplaySwitch.exe' anhängen; neuere Delphis haben das wahrscheinlich schon in der Klasse TPath oder sowas.

Grüße
Dalai

himitsu 28. Jan 2020 01:18

AW: DisplaySwitch über ShellExecute oder WinExec funktioniert nicht
 
Man könnte auch ganz böse C:\Windows hart einprogrammieren.

Als "Bugfix" für schrottige Programme, mit hartcodierten Pfaden, von saudämlichen Programmierern, heißt die Systempartition schon seit Jahren immer C:\ und das Windows-Rootverzeichnis immer Windows, also C:\Windows wird sich nie verändern. :stipid: (mindestens die nächsten Jahrzehnte)


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:06 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