![]() |
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. |
AW: DisplaySwitch über ShellExecute oder WinExec funktioniert nicht
Möglichweise benötigt der Aufruf erhöhte Rechte.
|
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? |
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)
|
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...
|
AW: DisplaySwitch über ShellExecute oder WinExec funktioniert nicht
Hmm..
Setze mal einfach 'cmd.exe /A /C ' vor deinen Aufruf. also:
Code:
Manche Batch-Befehle laufen nur in der CMD...
cmd.exe /A /C DisplaySwitch /internal
|
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. |
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 ![]() 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); |
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 ![]() |
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 08:12 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz