hallo, da ich für mein Programm
Simple Timer eine ähnliche Funktion brauchte, poste ich dir mal hier das Ergebnis:
Delphi-Quellcode:
procedure TMainForm.ShakeWindow(const aAmount, aLevel: Integer);
var
hWindow: HWnd;
R: TRect;
E, I, WindowWidth, WindowHeight: Integer;
begin
hWindow := GetForeGroundWindow;
// Get metrics
GetWindowRect(hWindow, R);
WindowWidth := R.Right - R.Left;
WindowHeight := R.Bottom - R.Top;
// big earthquake
for E := 1 to aAmount do
begin
// small quick shaking
for I := 1 to 10 do
begin
MoveWindow(hWindow, R.Left + Random(aLevel), R.Top + Random(aLevel), WindowWidth, WindowHeight, True);
Application.ProcessMessages;
Sleep(50 + Random(30));
end;
Sleep(300 + Random(500));
end;
// Restore old position
MoveWindow(hWindow, R.Left, R.Top, WindowWidth, WindowHeight, True);
end;
Der Aufruf erfolgt z. B. via ShakeWindow(3, 25). Du kannst das "for I := 1 to 10" natürlich auch noch durch einen variablen Wert ersetzen.
Falls dir was besseres/schöneres einfällt, wäre ich natürlich auch interessiert.
Achja, wg. Taskbar blinken lassen gibt es das hier:
Delphi-Quellcode:
procedure TMainForm.FlashAppWindow;
var
FWI: FlashWInfo;
begin
with FWI do
begin
cbSize := SizeOf(FWI);
hwnd := Application.Handle;
dwFlags := FLASHW_ALL; // and FLASHW_TIMERNOFG; //FLASHW_CAPTION;
SystemParametersInfo(SPI_GETFOREGROUNDFLASHCOUNT, 0, @FWI.uCount, 0);
dwTimeout := GetCaretBlinkTime; // div 8;
end;
FlashWindowEx(FWI);
end;