Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi createDesktop & Forms (https://www.delphipraxis.net/127452-createdesktop-forms.html)

delphis spassbremse 13. Jan 2009 16:14


createDesktop & Forms
 
Hallo,

ich habe mal wieder eine Frage, die
mich heute schon etliche Stunden beschäftigt hat.

Und zwar ich möchte einen neuen Desktop mit createDesktop erstellen.
Soweit kein Problem. Ich habe mir mal
Luckies Code angeschaut [hier].

Wenn ich aber die Procedure in eine VCL - Anwendung einbaue, dann funktioniert sie nur soweit,
dass der Neue Desktop erstellt wird und dann auch gar nix mehr macht.

Ich habe raugefunden, dass nach setThreadDesktop(), getLastError <> 0 zurückgibt.
Den ErrorCode 1447 (ERROR_NO_SCROLLBARS) (laut msdn) finde ich relativ komisch.
(Normalerweise müsste ich eventuell 170 für Thread in use)

Hat von euch jemand eine Idee was da schief laufen könnte?

Delphi-Quellcode:
procedure BaitAndSwitchDesktop;
var
  OldDesk     : HDESK;
  NewDesk     : HDESK;
begin
  OldDesk := GetThreadDesktop(GetCurrentThreadID);
  NewDesk := CreateDesktop(PChar('Foobar'), nil, nil, 0, DESKTOP_CREATEWINDOW or
    DESKTOP_SWITCHDESKTOP or DESKTOP_CREATEMENU or DESKTOP_WRITEOBJECTS, nil);
  if NewDesk <> 0 then
  begin
    showmessage(inttostr(windows.GetLastError));             // Gibt 0 zurück
    showmessage(booltostr(Windows.SetThreadDesktop(NewDesk)));
    showmessage(inttostr(windows.GetLastError));             // Gibt 1447 zurück
    Windows.SwitchDesktop(NewDesk);

      // Form erstellen

    Windows.SwitchDesktop(OldDesk);
    Windows.SetThreadDesktop(OldDesk);
    CloseDesktop(NewDesk);
  end;
  CloseDesktop(OldDesk);
end;
Grüße

Björn

Dezipaitor 13. Jan 2009 21:44

Re: createDesktop & Forms
 
Nach der MSDN Doku zu SetThreadDesktop funktioniert diese nur, wenn keine Handles des aktuellen Threads auf dem aktuelle Desktop bestehen. Und da die VCL das schon beim Programmstart geht das net.
Du musst also entweder einen neuen Thread verwenden, dann aber ohne VCL, oder du machst einen neuen Thread und startest darin die VCL.

Soweit ich weiß, gibt es bereits Posts dazu. Einfach mal CreateDesktop oder SetThreadDesktop suchen.


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