Einzelnen Beitrag anzeigen

Benutzerbild von turboPASCAL
turboPASCAL

Registriert seit: 8. Mai 2005
Ort: Sondershausen
4.274 Beiträge
 
Delphi 6 Personal
 
#2

Re: OSD unter Vista / 7 (Aero)

  Alt 24. Nov 2009, 00:47
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.
Matti
Meine Software-Projekte - Homepage - Grüße vom Rüsselmops -Mops Mopser
  Mit Zitat antworten Zitat