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 Eigener Desktop??? (https://www.delphipraxis.net/28279-eigener-desktop.html)

Doc Morelli 22. Aug 2004 15:56


Eigener Desktop???
 
Hallo,

kann man sich eigentlich einen eigenen Desktop erstellen? Hab mir mal folgendes angesehen, aber nicht wirklich verstanden (CreateDesktop). Wenn ja, kann jemand erklären, wie das geht oder ob es irgendwo ein Tutor gibt???

MFG Doc

Alexander 22. Aug 2004 16:12

Re: Eigener Desktop???
 
Hast du hier schon einmal nach CreateDesktop gesucht? Da wirst du bestimmt einige Beispiele finden...

Doc Morelli 22. Aug 2004 16:54

Re: Eigener Desktop???
 
Hab es mal mit folgenden Code probiert:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
SwitchDesktop(CreateDesktop('Oliver', nil, nil, DF_ALLOWOTHERACCOUNTHOOK, DESKTOP_CREATEMENU and DESKTOP_CREATEWINDOW and DESKTOP_ENUMERATE and DESKTOP_HOOKCONTROL and DESKTOP_JOURNALPLAYBACK and DESKTOP_JOURNALRECORD and DESKTOP_READOBJECTS and DESKTOP_SWITCHDESKTOP and DESKTOP_SWITCHDESKTOP, nil));
end;
Passiert aber nichts, was ist daran falsch???

DesktopManager
Diesen Desktopmanager hab ich mir auch angesehen, aber auch nicht ganz verstanden...

SleepyMaster 22. Aug 2004 17:04

Re: Eigener Desktop???
 
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
SwitchDesktop(CreateDesktop('Oliver', nil, nil, DF_ALLOWOTHERACCOUNTHOOK, DESKTOP_CREATEMENU or DESKTOP_CREATEWINDOW or DESKTOP_ENUMERATE or DESKTOP_HOOKCONTROL or DESKTOP_JOURNALPLAYBACK or DESKTOP_JOURNALRECORD or DESKTOP_READOBJECTS or DESKTOP_SWITCHDESKTOP or DESKTOP_SWITCHDESKTOP, nil));
end;
Ich glaube so müsste das heißen. Aber obs daran liegt???

SleepyMaster 22. Aug 2004 17:09

Re: Eigener Desktop???
 
Jo! Lag daran. Habs grade ausprobiert! Machts lieber nicht nach!

Doc Morelli 22. Aug 2004 17:25

Re: Eigener Desktop???
 
Bei mir klappts auch. Wie kann ich denn jetzt z.B. machen, dass ein Fenster angezeigt wird? Oder wie kann ich wieder zu meinem normalen Desktop zurückwechseln???

SleepyMaster 22. Aug 2004 17:28

Re: Eigener Desktop???
 
Guck dir mal MSDN-Library durchsuchenEnumDesktops an. Damit bekommst du dann eine Liste von den vorhandenen Desktops zu denen du dann per SwitchDesktop wieder zurück kommen kannst.

Doc Morelli 22. Aug 2004 17:42

Re: Eigener Desktop???
 
Code:
EnumDesktops(WINSTA_ENUMDESKTOPS, ?, ?);
Und was muss ich jetzt für die ? einsetzen? Und wie kann ich ein Fenster anzeigen?

SleepyMaster 22. Aug 2004 17:56

Re: Eigener Desktop???
 
Mit SetThreadDesktop kannst du einen Thread an einen bestimmten Desktop binden. Wenn du dann ein Fenster erzeugst, geht das automatisch auf den Desktop.

EnumDesktops(OpenWindowStation('???'), DeineEnumProcedure, Egal)

Doc Morelli 22. Aug 2004 18:22

Re: Eigener Desktop???
 
Das mit dem Fenster hab ich jetzt endlich verstanden...

Zitat:

EnumDesktops(OpenWindowStation('???'), DeineEnumProcedure, Egal)
Die Funktion soll mir ja alle Desktops anzeigen, die es gibt. Warum muss ich dann OpenWindowStation benutzen und was gehört da rein? Was ist denn meine EnumProcedure? Und Egal = nil? Sorry, sind wohl blöde Fragen, bin aber noch nicht ganz so fit in Delphi wie die meisten hier...

Alexander 22. Aug 2004 18:57

Re: Eigener Desktop???
 
Schau dir mal im MSDN die Parameter zu den genannten Methoden an: http://msdn.microsoft.com

Doc Morelli 22. Aug 2004 19:34

Re: Eigener Desktop???
 
Hab ich mir ja schon angesehen...

Code:
EnumDesktops(Openwindowstation('', True, DESKTOP_CREATEMENU or DESKTOP_CREATEWINDOW or DESKTOP_ENUMERATE or DESKTOP_HOOKCONTROL or DESKTOP_JOURNALPLAYBACK or DESKTOP_JOURNALRECORD or DESKTOP_READOBJECTS or DESKTOP_SWITCHDESKTOP or DESKTOP_SWITCHDESKTOP), ?, test);
Mit der eigenen enumProcedure blick ich noch nicht ganz durch. Währe nett, wenn mir da jemand helfen könnte...

Und: Wenn ich jetzt auf dem neuen Desktop bin, dann hab ich ja weder Icons, noch Startleist oder sonst irgendwas. Dann kann ich auch kein neues Fenster öffnen. Wie kann ich dann also einem Fenster den neuen Desktop zuweisen?

Doc Morelli 22. Aug 2004 21:23

Re: Eigener Desktop???
 
Ok, was hab ich hier jetzt falsch gemacht?

Code:
procedure TForm1.Button1Click(Sender: TObject);
begin
CreateDesktop('Oliver', nil, nil, DF_ALLOWOTHERACCOUNTHOOK, DESKTOP_CREATEMENU or DESKTOP_CREATEWINDOW or DESKTOP_ENUMERATE or DESKTOP_HOOKCONTROL or DESKTOP_JOURNALPLAYBACK or DESKTOP_JOURNALRECORD or DESKTOP_READOBJECTS or DESKTOP_SWITCHDESKTOP or DESKTOP_SWITCHDESKTOP, nil);
SetThreadDesktop(Opendesktop('Oliver', DF_ALLOWOTHERACCOUNTHOOK, true, DESKTOP_CREATEMENU or DESKTOP_CREATEWINDOW or DESKTOP_ENUMERATE or DESKTOP_HOOKCONTROL or DESKTOP_JOURNALPLAYBACK or DESKTOP_JOURNALRECORD or DESKTOP_READOBJECTS or DESKTOP_SWITCHDESKTOP or DESKTOP_SWITCHDESKTOP));
shellexecute(application.Handle, 'open', 'C:\Programme\Borland\Delphi7\Projects\Desktops\DesktopClosedpr.dpr', nil, nil, sw_shownormal);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
switchdesktop(Opendesktop('Oliver', DF_ALLOWOTHERACCOUNTHOOK, true, DESKTOP_CREATEMENU or DESKTOP_CREATEWINDOW or DESKTOP_ENUMERATE or DESKTOP_HOOKCONTROL or DESKTOP_JOURNALPLAYBACK or DESKTOP_JOURNALRECORD or DESKTOP_READOBJECTS or DESKTOP_SWITCHDESKTOP or DESKTOP_SWITCHDESKTOP));
end;
Es soll eine Datei im neuen Desktop geöffnet werden, mit der ich den Desktop 'Oliver' wieder schließen kann. Desktop wird auch geswitcht, aber das Fenster wird nicht angezeigt. Was ist daran nun wieder falsch???

//Edit: hab gerade gesehen, ich muss auch schon die exe-Datei öffnen... :? Aber das Fenster wird nicht im neuen Desktop geöffnet...

dizzy 22. Aug 2004 21:29

Re: Eigener Desktop???
 
AAAHHHHH! Quelltextformatierung!!! So kann das ja keiner lesen!

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  CreateDesktop('Oliver',
                nil,
                nil,
                DF_ALLOWOTHERACCOUNTHOOK,
                DESKTOP_CREATEMENU or
                  DESKTOP_CREATEWINDOW or
                  DESKTOP_ENUMERATE or
                  DESKTOP_HOOKCONTROL or
                  DESKTOP_JOURNALPLAYBACK or
                  DESKTOP_JOURNALRECORD or
                  DESKTOP_READOBJECTS or
                  DESKTOP_SWITCHDESKTOP or
                  DESKTOP_SWITCHDESKTOP,
                nil);
  SetThreadDesktop(Opendesktop('Oliver',
                               DF_ALLOWOTHERACCOUNTHOOK,
                               true,
                               DESKTOP_CREATEMENU or
                                 DESKTOP_CREATEWINDOW or
                                 DESKTOP_ENUMERATE or
                                 DESKTOP_HOOKCONTROL or
                                 DESKTOP_JOURNALPLAYBACK or
                                 DESKTOP_JOURNALRECORD or
                                 DESKTOP_READOBJECTS or
                                 DESKTOP_SWITCHDESKTOP or
                                 DESKTOP_SWITCHDESKTOP));
  shellexecute(application.Handle,
               'open',
               'C:\Programme\Borland\Delphi7\Projects\Desktops\DesktopClosedpr.dpr',
               nil,
               nil,
               sw_shownormal);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  switchdesktop(Opendesktop('Oliver',
                            DF_ALLOWOTHERACCOUNTHOOK,
                            true,
                            DESKTOP_CREATEMENU or
                              DESKTOP_CREATEWINDOW or
                              DESKTOP_ENUMERATE or
                              DESKTOP_HOOKCONTROL or
                              DESKTOP_JOURNALPLAYBACK or
                              DESKTOP_JOURNALRECORD or
                              DESKTOP_READOBJECTS or
                              DESKTOP_SWITCHDESKTOP or
                              DESKTOP_SWITCHDESKTOP));
end;
Evtl. kann da jetzt jemand was mit anfangen. Zum Problem selber weiss ich nix, aber das war ja grauenvoll ;)

Doc Morelli 22. Aug 2004 21:41

Re: Eigener Desktop???
 
Ok, ok. Tut mir leid, kommt nicht wieder vor... :?

Hoffe, mir kann trotzdem jemand helfen...

Doc Morelli 23. Aug 2004 12:32

Re: Eigener Desktop???
 
Habs das mit den Desktops jetzt hinbekommen:

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  hWinSta: THandle;
begin
  Listbox1.Clear;
  hWinSta := GetProcessWindowStation;
  EnumDesktops(hWinSta, @EnumDesktopsCallback, Integer(Listbox1));
  CloseWindowStation(hWinSta);
end;


procedure TForm1.Button2Click(Sender: TObject);
begin
switchdesktop(opendesktop(PChar(listbox1.Items.Strings[listbox1.ItemIndex]),
              DF_ALLOWOTHERACCOUNTHOOK,
              true,
              DESKTOP_CREATEMENU or
              DESKTOP_CREATEWINDOW or
              DESKTOP_ENUMERATE or
              DESKTOP_HOOKCONTROL or
              DESKTOP_JOURNALPLAYBACK or
              DESKTOP_JOURNALRECORD or
              DESKTOP_READOBJECTS or
              DESKTOP_SWITCHDESKTOP or
              DESKTOP_SWITCHDESKTOP));
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
createdesktop('Oliver', nil, nil, DF_ALLOWOTHERACCOUNTHOOK,
               DESKTOP_CREATEMENU or
              DESKTOP_CREATEWINDOW or
              DESKTOP_ENUMERATE or
              DESKTOP_HOOKCONTROL or
              DESKTOP_JOURNALPLAYBACK or
              DESKTOP_JOURNALRECORD or
              DESKTOP_READOBJECTS or
              DESKTOP_SWITCHDESKTOP or
              DESKTOP_SWITCHDESKTOP, nil);
end;
Jetzt stellt sich nur noch die Frage, warum kein neues Fenster erzeugt wird...

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  CreateDesktop('Oliver',
                nil,
                nil,
                DF_ALLOWOTHERACCOUNTHOOK,
                DESKTOP_CREATEMENU or
                  DESKTOP_CREATEWINDOW or
                  DESKTOP_ENUMERATE or
                  DESKTOP_HOOKCONTROL or
                  DESKTOP_JOURNALPLAYBACK or
                  DESKTOP_JOURNALRECORD or
                  DESKTOP_READOBJECTS or
                  DESKTOP_SWITCHDESKTOP or
                  DESKTOP_SWITCHDESKTOP,
                nil);
  SetThreadDesktop(Opendesktop('Oliver',
                               DF_ALLOWOTHERACCOUNTHOOK,
                               true,
                               DESKTOP_CREATEMENU or
                                 DESKTOP_CREATEWINDOW or
                                 DESKTOP_ENUMERATE or
                                 DESKTOP_HOOKCONTROL or
                                 DESKTOP_JOURNALPLAYBACK or
                                 DESKTOP_JOURNALRECORD or
                                 DESKTOP_READOBJECTS or
                                 DESKTOP_SWITCHDESKTOP or
                                 DESKTOP_SWITCHDESKTOP));
  shellexecute(application.Handle,
               'open',
               'C:\Programme\Borland\Delphi7\Projects\Desktops\DesktopClosedpr.dpr',
               nil,
               nil,
               sw_shownormal);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  switchdesktop(Opendesktop('Oliver',
                            DF_ALLOWOTHERACCOUNTHOOK,
                            true,
                            DESKTOP_CREATEMENU or
                              DESKTOP_CREATEWINDOW or
                              DESKTOP_ENUMERATE or
                              DESKTOP_HOOKCONTROL or
                              DESKTOP_JOURNALPLAYBACK or
                              DESKTOP_JOURNALRECORD or
                              DESKTOP_READOBJECTS or
                              DESKTOP_SWITCHDESKTOP or
                              DESKTOP_SWITCHDESKTOP));
end;
MFG Doc

w3seek 23. Aug 2004 12:39

Re: Eigener Desktop???
 
Du kannst SetThreadDesktop() nur verwenden wenn der aufrufende Thread keine Fenster besitzt.

Doc Morelli 23. Aug 2004 13:07

Re: Eigener Desktop???
 
Zitat:

Zitat von SleepyMaster
Mit SetThreadDesktop kannst du einen Thread an einen bestimmten Desktop binden. Wenn du dann ein Fenster erzeugst, geht das automatisch auf den Desktop.

Außerdem hat der neue Desktop, den ich dann erstelle, noch gar kein Fenster... Gibt es denn eine Möglichkeit, ein aktuelles Fenster an einen bestimmten Desktop zu binden? Oder wie kann ich das dann machen, dass
Delphi-Quellcode:
  shellexecute(application.Handle,
               'open',
               'C:\Programme\Borland\Delphi7\Projects\Desktops\DesktopClosedpr.exe,
               nil,
               nil,
               sw_shownormal);
im neuen Desktop angezeigt wird???

MFG Doc

SleepyMaster 23. Aug 2004 13:09

Re: Eigener Desktop???
 
So! Hab jetzt mal en Beispiel geschrieben wie man das alles verwenden kann

Delphi-Quellcode:
program Desk;

uses
  Windows,
  Messages;

function MainWndProc(hWindow: HWND; Msg: UINT; wParam: wParam;
  lParam: lParam): LRESULT; stdcall; export;
var
  ps: TPaintStruct;
begin
  Result := 0;
  case Msg of
    WM_PAINT:
      begin
        BeginPaint(hWindow, ps);
        SetBkMode(ps.hdc, TRANSPARENT);
        TextOut(ps.hdc, 10, 10, 'Hello World!', 12);
        EndPaint(hWindow, ps);
      end;
    WM_DESTROY: PostQuitMessage(0);
    else
      begin
        Result := DefWindowProc(hWindow, Msg, wParam, lParam);
        Exit;
      end;
  end;
end;

var
  wc: TWndClass;
  hWindow: HWND;
  Msg: TMsg;
  OldDesktop, Desktop: HDESK;
begin
OldDesktop:=GetThreadDesktop(GetCurrentProcessId);
Desktop:= CreateDesktop('Oliver', nil, nil, DF_ALLOWOTHERACCOUNTHOOK, GENERIC_ALL, nil);
SetThreadDesktop(Desktop);
switchdesktop(Desktop);
  wc.lpszClassName := 'YourAppClass';
  wc.lpfnWndProc  := @MainWndProc;
  wc.Style        := CS_VREDRAW or CS_HREDRAW;
  wc.hInstance    := hInstance;
  wc.hIcon        := LoadIcon(0, IDI_APPLICATION);
  wc.hCursor      := LoadCursor(0, IDC_ARROW);
  wc.hbrBackground := (COLOR_WINDOW + 1);
  wc.lpszMenuName := nil;
  wc.cbClsExtra   := 0;
  wc.cbWndExtra   := 0;
  RegisterClass(wc);
  hWindow := CreateWindowEx(WS_EX_CONTROLPARENT or WS_EX_WINDOWEDGE,
    'YourAppClass',
    'Desktop',
    WS_VISIBLE or WS_CLIPSIBLINGS or
    WS_CLIPCHILDREN or WS_OVERLAPPEDWINDOW,
    CW_USEDEFAULT, 0,
    400, 300,
    0,
    0,
    hInstance,
    nil);

  ShowWindow(hWindow, CmdShow);
  UpDateWindow(hWindow);

  while GetMessage(Msg, 0, 0, 0) do
  begin
    TranslateMessage(Msg);
    DispatchMessage(Msg);
  end;
  Halt(Msg.wParam);
SetThreadDesktop(OldDesktop);
switchdesktop(OldDesktop);
CloseDesktop(Desktop);
end.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:46 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-2025 by Thomas Breitkreuz