Autor Beitrag
Jörg1
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 27



BeitragVerfasst: Sa 27.11.04 01:55 
Hallo,

Mein Name ist Jörg und bin neu in diesem Forum. ich habe folgendes Problem : Bei Win XP kann man unter den Eigenschaften der Taskleiste einstellen bzw. wählen, ob diese IMMER im Vordergrund bleiben soll. Wenn man sich nun dafür entschieden hat, wird die Taskleiste fortan nicht mehr von Fenstern verdeckt werden können und immer sichtbar bleiben. Wie muss ich jedoch vorgehen, wenn ich ein Programm entwickeln möchte mit einem Fenster, daß den kompletten Bildschirm ausfüllen soll? Gibt es dafür in den Fenstereigenschaften vielleicht eine Einstellungsmöglichkeit, die es mir ermöglicht, die "feste", immer im Vordergrund bleibende Taskleiste doch zu überdecken oder kann diese Betriebssystemeinstellung von meinem eigenen Programm nicht umgangen werden? Wenn nicht, wie kann ich aus meinem eigenen Programm heraus diese Taskleisteneinstellung für die Laufzeit meines Programmes modifizieren und anschließend wieder rücksetzen? Über eine Antwort würde ich mich sehr freuen. :)

MfG

Jörg

Moderiert von user profile iconTino: Titel geändert.
Moderiert von user profile iconTino: Topic aus Sonstiges verschoben am Fr 03.12.2004 um 09:39
Sprint
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 849



BeitragVerfasst: Sa 27.11.04 02:39 
Da stehen dir zwei Möglichkeiten zur Verfügung. Entweder du machst es ganz einfach SetWindowPos(..., HWND_TOPMOST, ...) oder du machst es ein bißchen feiner und platzierst deine Form mit SHAppBarMessage. Dann hast du das selbe Verhalten wie die Taskleiste. Immer im Vordergrund, ausblenden usw.

_________________
Ciao, Sprint.
Jörg1 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 27



BeitragVerfasst: Di 30.11.04 20:12 
Titel: Lösung gefunden
Hallo,

Danke für Deine Antwort :) . Mittlerweile hat sich jedoch für mich eine Lösung ergeben, die sehr viel einfacher ist und anscheinend funktioniert, obwohl ich es mir eigentlich nicht erklären kann, WARUM es so funktioniert. Um es Dir ein bischen verständlicher zu machen, was ich eigentlich erreichen möchte, muss ich ein bischen weiter ausholen.

Ich möchte in meinem Programm den Vollbildmodus mit Hilfe eines normalen Formulars bzw. Fensters vortäuschen bzw simulieren. Dazu müssen folgende Bedingungen unbedingt erfüllt sein :

1.) Das Fenster muss zu jeder Zeit den kompletten Bildschirm ausfüllen können, d.h. auch die Taskleiste überdecken, unabhängig von der Einstellung im Betriebssystem.
2.) Das Fenster darf keinen sichtbaren Rahmen haben, nicht größenveränderbar sein und keine Titelleiste aufweisen.

Das Herumexperimentieren mit "FormStyle", was ich von fsNormal auf fsStayOnTop setzte, brachte nicht das, was ich brauchen konnte. Ich war zwar jetzt in der Lage, Fenster über die Taskleiste zu verschieben und dabei im Vordergrund zu bleiben, wenn ich jedoch die Eigenschaft "WindowState" auf wsMaximized setze, wird zur Laufzeit das Fenster zwar maximiert dargestellt, der untere Rand endet jedoch wieder an der oberen Taskleistenkante und war somit für mich unbrauchbar.
Nachdem ich alles wieder auf die Standardwerte zurückgesetzt hatte, fing ich an, mich mit "BorderStyle" zu beschäftigen. Da ich ja keinen sichtbaren Rahmen und Titelleiste brauche, setzte ich diese Eigenschaft auf bsNone. Zusätzlich setzte ich "WindowState" wieder auf wsMaximized.
Was für mich nun vollkommen überraschend ist : Das nun rahmen - und titelleistenlose Fenster wird anstandslos maximiert dargestellt und endet NICHT!! am oberen Rand der Taskleiste, sondert füllt nun den KOMPLETTEN Bildschirm aus, obwohl laut Taskleisteneinstellung diese eigentlich immer im Vordergrund bleiben müsste. Warum dies nun so ist, kann ich mir nicht ganz erklären. Ich kann nur vermuten, daß vielleicht ein Fensterrahmen abgefragt wird vom Betriebssystem. Existiert dieser Rahmen aber nicht optisch, kann die Kontrolle nicht genau stattfinden bezüglich der Taskleiste. Entweder ist dies nun beabsichtigt oder eine Ungenauigkeit vom Betriebssystem. In der Delphi-Hilfe konnte ich darüber auch keine Informationen finden. Es funktioniert jedenfalls, Gott sei Dank :). Ich hab übrigens D5 Standard auf XP Prof.

Wenn Du vielleicht eine Erklärung für diesen Effekt hast, würde ich mich freuen, nochmal von Dir zu hören, denn Du scheinst ja schon etwas mehr Ahnung zu haben als ich :)

Mit freundlichen Grüßen

Jörg
BlackRaven
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 26



BeitragVerfasst: Mi 01.12.04 14:13 
Bedenke (ich weiß ja ned was bei dir passiert, wenn die taskleiste doch sichtbar wird), aber mit der Windowstaste lässt sich diese doch einblenden, verschwindet aber wieder, wennn die form wieder aktiviert wird
JustusJonas
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 222



BeitragVerfasst: Mi 01.12.04 14:40 
Das kein Rahmen angezeigt wird und die Größe der Form nicht veränderbar sein soll, kannst du ja in den Eigenschaften der Form einstellen.

Ansonsten hab ich mal für ein Programm die Taskleiste "verschwinden lassen" mit folgendem Befehl:

ausblenden Delphi-Quelltext
1:
2:
3:
StrPCopy(@wndClass[0], 'Shell_TrayWnd');
wndHandle := FindWindow(@wndClass[0], nil);
ShowWindow(wndHandle, SW_HIDE);


Musst sie bei Programmende aber auch natürlich wieder sichtbar machen:

ausblenden Delphi-Quelltext
1:
2:
3:
StrPCopy(@wndClass[0], 'Shell_TrayWnd');
wndHandle := FindWindow(@wndClass[0], nil);
ShowWindow(wndHandle, SW_RESTORE);


Hoffe das hilft dir ein wenig weiter!

Greetz
Jörg1 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 27



BeitragVerfasst: Mi 01.12.04 17:53 
Titel: Taskleiste
Hallo,

Oh ja, verdammt, Du hast recht, die verfluchte Win95-Taste. Daran hatte ich nicht gedacht. Da muss ich mir dann wohl doch was anderes überlegen. Vielen Dank für die Info :) Und ebenfalls dankeschön für die Codes :)
Coder
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1383
Erhaltene Danke: 1

WinXP
D2005 PE
BeitragVerfasst: Mi 01.12.04 19:29 
Du könntest die Windows Taste ja auch einfach abschalten :gruebel:
So vieleicht? :nixweiss:
Jörg1 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 27



BeitragVerfasst: Mi 01.12.04 20:18 
Titel: Abschalten
Hallo,

Ja, genau, daran zerbreche ich mir momentan den Kopf. Ich wollte ganz schlau sein und das Ärgernis mit einer OnKeyUp-Prozedur(deswegen OnKeyUp, weil die Taskleiste erst beim loslassen der Win95-Taste erscheint!!!!) "if key = VK_LWIN then form1.color:=clred (Farbänderung nur zum testen!!!!)" lösen, aber Fehlanzeige :( So einfach macht es mir Windows leider nicht. Zwar funktioniert diese Anweisung bzw. Prozedur,trotzdem kommt die Taskleiste wieder :( . Ich muss also noch zusätzlich verhindern, das die Botschaft der Win95-Taste an Windows weitergeleitet wird. Man muss die also irgendwie abfangen bzw. blocken. Und dies wird sich wohl als ziemlich schwierig herausstellen. Hab mal in der Delphi-Hilfe gestöbert, da steht schon was von Botschaftsbehandlungsroutinen und Abfangmöglichkeiten. Aber bei den schlechten bzw. teilweise nicht vorhandenen Beispielen blick ich da nicht durch. Gibt es vielleicht einen ganz einfachen Weg, den ich gar nicht gesehen habe oder wie muss ich da vorgehen?

MfG

Jörg
Coder
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 1383
Erhaltene Danke: 1

WinXP
D2005 PE
BeitragVerfasst: Mi 01.12.04 21:10 
Soo
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
procedure ShowTaskBar(AShow: Boolean);
const
  cmdShow: array[Boolean] of Integer = (SW_HIDE, SW_SHOW);
var
  Handle: THandle;
begin
  Handle := FindWindow('Shell_TrayWnd', nil);
  if Handle <> 0 then
    ShowWindow(Handle, cmdShow[AShow]);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  ShowTaskBar(false);
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  ShowTaskBar(true);
end;
Damit ist die Taskleiste während des Programms abgeschaltet. :mrgreen:

Aber über die Windows Taste läst sich immernoch das Startmenü aufklappen. :(

Ich glaube langsam das ist unmöglich! :roll:

Edit\\ Guck mal hier.
Jörg1 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 27



BeitragVerfasst: Mi 01.12.04 21:44 
Titel: Taskleiste
Hallo,

Danke für den Code :) Da ich Anfänger bin, ist dieser für mich jedoch schwer nachzuvollziehen. Ich denke doch, daß es möglich ist. Es muss möglich sein, die Profis machen es ja auch. Ich glaube, die Lösung liegt wirklich darin, die Nachricht bzw. Botschaft abzufangen, die bei der Betätigung der linken oder rechten Win95-Taste ans Betriebssystem geschickt wird. Gibt da wohl so einen Befehl bzw. Funktion namens "MessageHook". Irgendwie muss ich mich da durchbeißen. Wird mich bestimmt noch einige Tage oder Wochen kosten. Vielleicht sollte ich mal einen Blick in diverse Delphi-Bücher werfen :)

Trotzdem nochmals dankeschön für die doch sehr zahlreiche Unterstützung. Ich würde mich gerne revanchieren hier mit Beiträgen, aber dafür kenne ich einfach noch zu wenig

MfG

Jörg