Delphi-PRAXiS
Seite 1 von 2  1 2      

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


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:31 Uhr.
Seite 1 von 2  1 2      

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