Zitat von
virus82:
Ach ja ich nutze Delphi2009, auf Windows XP Professional SP3.
Selbes System (32 Bit) ... keine Probleme (egal ob eigenes Fenster oder Notepad minimiert wurde)
Außerdem: GetLastError sollte man sich gleich holen und nicht erst irgendwas anderes ziwschendurch machen, welches den Wert verändern könnte.
Also selbst wenn SetLayeredWindowAttributes fehlschlägt und dann aber GetLayeredWindowAttributes erfolgreich ist und auch noch den Fehler-Code zurück/neu setzt, dann würdest du da nie einen Fehler von SetLayeredWindowAttributes erhalten.
Delphi-Quellcode:
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
begin
Error := GetLastError;
//Fehler holen
s := s + '
SetLayeredWindowAttributes nicht erfolgreich' + #10#13;
//kommt nie vor
if (Error = 0)
then
s := s + '
GetLastError = 0' + #10#13
else
s := s + '
GetLastError = ' + IntToStr(Error) + #10#13;
end;
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
begin
Error := GetLastError;
//Fehler holen
s := s + '
GetLayeredWindowAttributes nicht erfolgreich' + #10#13;
if (Error = 0)
then
s := s + '
GetLastError = 0' + #10#13
else
s := s + '
GetLastError = ' + IntToStr(Error) + #10#13;
end;
s := s + '
AlphaBlendValue = ' + IntToStr(AlphaValue) + #10#13;
//einfach immer ausgeben
end;
ShowMessage(s);
end;