Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   OSD unter Vista / 7 (Aero) (https://www.delphipraxis.net/143797-osd-unter-vista-7-aero.html)

TNoob 23. Nov 2009 21:50


OSD unter Vista / 7 (Aero)
 
Hallo Leute!

Bezug nehmend auf folgenden Artikel http://www.delphipraxis.net/internal...ct.php?t=74673 suche ich nach einer Lösung für Windows Vista / 7, wenn Aero aktiviert ist.

Die Funktion aus oben genannten Artikel verwende ich schon seit einer Weile. Mit Windows 7 musste ich jetzt mit Enttäuschen feststellen, dass dies so nicht mehr möglich ist. SetBkMode(,TRANSPARENT) legt eigentlich fest, das kein Hintergrund gezeichnet wird. Leider ist der Hintergrung jetzt schwarz.
Ich vermute es liegt an dem neuen Desktop Management von Windows. Ich konnte bislang kaum etwas in Erfahrung bringen darüber. Schon gar nicht, was mit einem Delphi7 Personal in der Richting zu realisieren ist.

Hat jemand eine Idee, wie man den Text wieder transparent auf den Screen "schreiben" kann?

MfG
TNoob

turboPASCAL 24. Nov 2009 01:47

Re: OSD unter Vista / 7 (Aero)
 
Der von dir und Knotti2005 verwendete Quelltext ist und bleibt einfach unsicher.
Es ist und bleibt einfach ein schlechter Stylte in einen anderen Canvas zu zeichnen, da man nie weis
was das andere Programm damit noch alles anstellt.
Zu Windows 9x Zeiten war dies eine Notlösung.

Erstelle dir ein Programmeigenes Fenster, setze dies transparent, zeichne darauf und alles wird gut.

Delphi-Quellcode:
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

type
  TForm1 = class(TForm)
    Timer1: TTimer;
    Label1: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

function SetLayeredWindowAttributes(hwnd: HWND; crKey: COLORREF; bAlpha: Byte;
  dwFlags: DWORD): BOOL; stdcall; external user32 name 'SetLayeredWindowAttributes';

procedure TForm1.FormCreate(Sender: TObject);
var
  ExStyle: integer;
begin
  Self.BorderStyle := bsNone;
  Self.BorderIcons := [biSystemMenu];
  Self.Left       := 10;
  Self.Top        := 20;
  Self.Width      := 300;
  Self.Height     := 40;
  Self.FormStyle  := fsStayOnTop;
  Self.Color      := clBlack;

  Label1.Font.Color := clRed;
  Label1.Font.Style := [fsBold];

  ExStyle := GetWindowLong(Self.Handle, GWL_EXSTYLE); //Extended Style holen

  if ((ExStyle and WS_EX_LAYERED) = 0) then //kein Layered Fenster ?
    ExStyle := ExStyle or WS_EX_LAYERED;

  if ((ExStyle and WS_EX_TRANSPARENT) = 0) then //kein "druchklickbares" Fenster ?
    ExStyle := ExStyle or WS_EX_TRANSPARENT;

  // neuen Fensterstyle setzen
  SetWindowLong(Self.Handle, GWL_EXSTYLE, ExStyle); //dann Layered setzen

  SetLayeredWindowAttributes(Self.Handle, 0, 200, LWA_COLORKEY or LWA_ALPHA); //AlphaBlend werte setzen
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
  Label1.Caption := 'OSD: ' + TimeToStr(Now);
end;

end.


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