Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi DOS-Box SW_SHOWNORMAL / SW_HIDE (https://www.delphipraxis.net/95990-dos-box-sw_shownormal-sw_hide.html)

stz 17. Jul 2007 12:00


DOS-Box SW_SHOWNORMAL / SW_HIDE
 
Moin moin,
ich habe mit CreateProcess einen Konsolenanwendung gestartet
Delphi-Quellcode:
//initialize the startupinfo
FillChar(myStartupInfo, SizeOf(TStartupInfo), 0);
myStartupInfo.cb := Sizeof(TStartupInfo);
myStartupInfo.dwFlags := STARTF_USESHOWWINDOW;
myStartupInfo.wShowWindow := SW_HIDE;

//start process
CreateProcess(nil, PChar(Command), nil, nil, False, NORMAL_PRIORITY_CLASS, nil, PChar(ExtractFilePath(Application.ExeName)), myStartupInfo, myProcessInfo);
Nun will ich zu einem späteren Zeitpunkt das Fenster / die DOS-Box einblenden. Dazu hohle ich mir das Handle des Fensters:
Delphi-Quellcode:
LameWindowHandle := FindWindow('ConsoleWindowClass', PChar(ExtractFilePath(ParamStr(0)) + 'lame.exe'));
Lese den WindowLong des Fensters aus:
Delphi-Quellcode:
dwNewLong := GetWindowLong(LameWindowHandle, GWL_STYLE);
  if dwNewLong = 0 then
    RaiseLastOSError;
Manipuliere den WindowLong um das Fenster anzuzeigen:
Delphi-Quellcode:
dwNewLong := dwNewLong and not SW_HIDE;
dwNewLong := dwNewLong or SW_SHOWNORMAL;
Setze den WindowLong wieder:
Delphi-Quellcode:
if SetWindowLong(LameWindowHandle, GWL_STYLE, dwNewLong) = 0 then
  RaiseLastOSError;
und erhalte folgende Fehlermeldung:
Code:
---------------------------
LameStarter
---------------------------
Systemfehler. Code: 1413.

Ungültiger Index.
---------------------------
OK  
---------------------------
Die Fehler wird genau an der letzten geposteten Quelltextzeile (RaiseLastOSError) ausgelöst.
Der Index GWL_STYLE ist aber laut PDSK genau der richtige:
Zitat:

Zitat von PDSK SetWindowLong Function Parameters nIndex
GWL_STYLE
Sets a new window style.

und hat ja auch bei GetWindowLong super funktioniert. Laut Debugger habe ich sowohl ein WindowHandle als auch ein WindowLong-Wert erhalten.
Was mache ich also falsch?? :gruebel:

Gruß
Malte

turboPASCAL 17. Jul 2007 12:20

Re: DOS-Box SW_SHOWNORMAL / SW_HIDE
 
Dumme Frage nebenbei, warum nutzt du nicht die lame.dll ?
(Irgend wo hatte ich mal ein Demo geposted... ...da.)


Eine weitere Möglichkeit ist den Ausgabetext der Lame.exe in ein Memo o. ä. umzuleiten. * klick me *

Zitat:

Was mache ich also falsch??
Fasst nix, nur das nach dem Beenden des Processes
kein Fenster mehr da ist um es anzuzeigen.

// Edit: Link added.

stz 17. Jul 2007 12:31

Re: DOS-Box SW_SHOWNORMAL / SW_HIDE
 
Zitat:

Zitat von turboPASCAL
Dumme Frage nebenbei, warum nutzt du nicht die lame.dll ?
(Irgend wo hatte ich mal ein Demo geposted... ...da.)

Super, Danke. Ich glaube, ich habe auch schon Delphi-Header unter scp.assarbad.org gefunden. Mal sehen... Aber hier geht's jetzt ums Prinzip. Was ich will muss ja auch gehen.

Zitat:

Zitat von turboPASCAL
Zitat:

Was mache ich also falsch??
Fasst nix, nur das nach dem Beenden des Processes
kein Fenster mehr da ist um es anzuzeigen.

Nette These, aber mein Prozess ist definitiv noch nicht beendet. Ich würde auch nicht verstehen, wieso ich ein Fenster-Handle auslesen kann, von diesem Fenster WindowLong auslesen kann und beim Setzen kommt dann die Fehlermeldung. Das würde ja heißen, dass ich von einem nicht vorhandenen Fenster das WindowLong ausgelesen habe.
Außerdem würde in dem Fall eine Fehlermeldung kommen, die mir mitteilen würde, dass das Window-Handle ungültig sei. Passt also nicht so ganz...

Gruß
Malte

SirThornberry 17. Jul 2007 12:49

Re: DOS-Box SW_SHOWNORMAL / SW_HIDE
 
die richtige Lösung wäre mit Pipes die Ausgabe einfach umzulenken.

DGL-luke 17. Jul 2007 13:01

Re: DOS-Box SW_SHOWNORMAL / SW_HIDE
 
Die API-Funktion MSDN-Library durchsuchenShowWindow() sollte dir da eher weiterhelfen. Dass Windows empfindlich auf das Setzen der Style-Werte reagiert, finde ich nachvollziehbar.

SirThornberry 17. Jul 2007 13:24

Re: DOS-Box SW_SHOWNORMAL / SW_HIDE
 
aua, jetzt sehe ich erst was du gemacht hast:
Delphi-Quellcode:
dwNewLong := dwNewLong and not SW_HIDE;
dwNewLong := dwNewLong or SW_SHOWNORMAL;
das passt nicht. Du vermixt hier Äpfel mit Birnen. Du kannst doch auch nicht wenn du ein Auto kaufst sagen das du als Extra einen Elektrohert in dem Opel-Korsa heben willst. Das geht einfach nicht und gehört nicht zusammen. Gültige Konstanten für GWL_STYLE beginnen mit WS_
deine Konstanten beginnen hingegen mit SW_
Schau dir wenn du sowas vor hast bitte vorher SetWindowLong in der Hilfe an.

Um dir zu verdeutlichen was du damit versucht hast:

die von dir verwendeten Konstanten:
SW_Hide = 0
SW_SHOWNORMAL = 1

Windowstyles mit diesen Werten
0 = WS_OVERLAPPED
1 = gibt es nicht -> Ungültiger Index.

Jetzt stell dir vor es gäbe eine Konstante mit dem Wert 1 für die Windowstyles. Dann würde diese was ganz anderes bewirken als du vor hattest. Daher nutze nur Konstanten für etwas wofür sie auch vorgesehen sind.

Die Konstante WS_VISIBLE wäre hier also richtiger. Wenn du aber in die Hilfe schaust steht dort:
Zitat:

WS_VISIBLE
Creates a window that is initially visible.
This style can be turned on and off by using ShowWindow or SetWindowPos.

DGL-luke 17. Jul 2007 13:26

Re: DOS-Box SW_SHOWNORMAL / SW_HIDE
 
wird trotzdem nicht funktionieren. nicht mit setwindowlong.

stz 17. Jul 2007 13:42

Re: DOS-Box SW_SHOWNORMAL / SW_HIDE
 
Moin moin,
autsch :oops: da ging bei mir aber einiges durcheinander

Mit ShowWindow funktioniert das ein- und ausblenden super :dp:

Fazit: Entweder Ledersitze im Opel oder E-Herd in der Küche - Ich habe verstanden :wink:

Gruß
Malte


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