Einzelnen Beitrag anzeigen

virus82

Registriert seit: 29. Jun 2007
Ort: Leipzig
34 Beiträge
 
Delphi 2009 Professional
 
#1

GetLayeredWindowAttributes funktioniert nicht noch Resize

  Alt 21. Okt 2009, 08:53
Hey,

an alle Windows API Spezialisten. Ich hab folgendes Problem, seit WinXP gibt es die Funktion GetLayeredWindowAttributes in der user32.dll, die allerdings nur funktioniert wenn ich das Fenster weder Minimiere, Maximiere oder die Größe verändere. Sobald die Größe verändert wird liefert die Funktion immer False zurück, aber ohne Fehler (GetLastError ist auch immer 0).

Ziel ist es das ich AlphaBlendValue für ein beliebiges sichtbares Fenster ermitteln will (zum Beispiel Notepad). Ich setze als erstes den AlphaBlendValue mit SetLayeredWindowAttributes auf 200 und versuche es dann wieder zu ermitteln. Das klappt auch soweit. Minimiere ich allerdings das Fenster und zeige es wieder an, liefert GetLayeredWindowAttributes immer wieder False zurück.

Irgendeiner ne Idee woran das liegt, ist es ein Bug in WinXP oder ich mach irgendwas total falsch.

Hier mal ein einfaches Beispiel, ein Notepad Fenster muß geöffnet sein.

Delphi-Quellcode:
function GetLayeredWindowAttributes(hwnd: HWND; var crKey: COLORREF; var bAlpha: BYTE;
  var dwFlags: DWORD): BOOL; stdcall; external user32 name 'GetLayeredWindowAttributes';
function SetLayeredWindowAttributes(hwnd: HWND; crKey: COLORREF; bAlpha: Byte;
  dwFlags: DWORD): BOOL; stdcall; external user32 name 'SetLayeredWindowAttributes';

implementation

...

procedure TestAlphaBlend;
var
  hHandle: THandle;
  ExStyle: DWORD;
  bResSet: Boolean;
  bResGet: Boolean;
  AlphaValue: Byte;
  TranspColor: COLORREF;
  Flags: DWORD;
  Error: Cardinal;
  s: String;
begin
  s := 'nix';
  AlphaValue := 0;
  Flags := 0;
  hHandle := FindWindowEx(0, 0, 'Notepad', nil); //Fensterhandle von einem Notepad
  if ((hHandle <> INVALID_HANDLE_VALUE) and //gültiges Handle
      (IsWindowVisible(hHandle))) then //Fenster sichtbar
    begin
      s := '';
      ExStyle := GetWindowLong(hHandle, GWL_EXSTYLE); //Extended Style holen
      if ((ExStyle and WS_EX_LAYERED) = 0) then //wenn kein Layered Fenster
        SetWindowLong(hHandle, GWL_EXSTYLE, ExStyle or WS_EX_LAYERED); //dann Layered setzen

      bResSet := SetLayeredWindowAttributes(hHandle, 0, 200, LWA_ALPHA); //AlphaBlend mit Wert 200 setzen
      if bResSet then
        s := s + 'SetLayeredWindowAttributes erfolgreich' + #10#13
      else
        s := s + 'SetLayeredWindowAttributes nicht erfolgreich' + #10#13; //kommt nie vor

      bResGet := GetLayeredWindowAttributes(hHandle, TranspColor, AlphaValue, Flags); //AlphaBlend ermitteln
      if bResGet then
        begin
          s := s + 'GetLayeredWindowAttributes erfolgreich' + #10#13;
          if ((Flags and LWA_ALPHA) > 0) then //ob AlphaBlend gesetzt ist
            s := s + 'AlphaBlend = True' + #10#13
          else
            s := s + 'AlphaBlend = False' + #10#13
        end
      else
        s := s + 'GetLayeredWindowAttributes nicht erfolgreich' + #10#13;

      s := s + 'AlphaBlendValue = ' + IntToStr(AlphaValue) + #10#13; //einfach immer ausgeben

      Error := GetLastError; //Fehler holen
      if (Error = 0) then
        s := s + 'GetLastError = 0' + #10#13
      else
        s := s + 'GetLastError = ' + IntToStr(Error) + #10#13;
    end;

  ShowMessage(s);
end;

procedure TFormMain.Button1Click(Sender: TObject);
begin
  TestAlphaBlend;
end;
Ach ja ich nutze Delphi2009, auf Windows XP Professional SP3.

Irgendwie bin ich ratlos.
Marco
  Mit Zitat antworten Zitat