function WinampVisWin(VisInfo: PWinampVisInfo): HWND;
var
WinAtom: TAtom;
wClass: TWNDCLASSEX;
Msg: TMsg;
AppREC: Trect;
const
AppClass = '
Winamp v1.x';
// Übergebe den ClassenNamen
AppTitle = '
Winamp 5.2';
// Übergebe den Window Titel (Caption)
begin
if VisPlgHandle <> 0
then // Erstelle das VisDummy Fenster
begin
try
UnRegisterClass(AppClass, hInst);
hInst := 0;
VisInfo^.Init2 := False;
VisPlgHandle := 0;
except
Messagebox(0,'
Winamp Emulations Fenster konnte nicht erstellt werden',
'
Fatal Error!!', MB_ICONERROR);
end;
end;
hInst := GetModuleHandle(
nil);
// Hole die Apllikations Instanz
with wClass
do
begin
cbSize := sizeof(wClass);
Style := CS_PARENTDC
or CS_VREDRAW;
lpfnWndProc := @WinampVisWndProc;
cbClsExtra := 0;
cbWndExtra := 0;
hInstance := hInst;
hIcon := 0;
hCursor := LoadCursor(0, IDC_ARROW);
hbrBackground := COLOR_BTNFACE + 1;
lpszMenuName :=
nil;
lpszClassName := AppClass;
hIconSm := 0;
end;
// Classe registrieren. Bei erfolg das Window erstellen
WinAtom := Windows.RegisterClassEx(wClass);
if WinAtom <> 0
then
Result := CreateWindowEx(0, AppClass, AppTitle,
WS_POPUP,
// Kein Frame, Unsichtbar
0, 0, 275, 116,
// x, y, width, height
{parent} 0, 0, hInst,
nil)
else
Result := 0;
// Hwnd von der ausführenden Anwendung
if AppParentHandle <> 0
then
begin
AmpHandle := 0;
VisPlgHandle := Result;
repeat
AmpHandle := BASS_WINAMPVIS_GetAmpHwnd;
until amphandle <> 0;
// Den WindowRecord der Hauptanwendung in erfahrung bringen
GetWindowRect(AppParentHandle, AppREC);
// Das API-Fenster AppClass Winamp v1.x den Ausmaßen anpassen
// wird verwendet wenn Plugin's eine Docking funktion anbieten.
MoveWindow(VisPlgHandle, 0, 0, AppREC.Right - AppREC.Left, AppREC.Bottom - AppREC.Top, True);
end
else
VisPlgHandle := Result;
VisInfo^.WinHandle := VisPlgHandle;
WinampVisExecute(Filename, Vismod, VismodCounter, VisPlgHandle);
// ParentWindow den Plugins zuweisen
VisInfo^.VisModule^.hwndParent := VisPlgHandle;
// Plugin Initialisieren und ausführen
VisInfo^.VisModule^.Init(VisInfo^.VisModule);
// Das API-Fenster AppClass Winamp v1.x als ParentFenster in
// die Hauptanwendung (AppParentHandle) verschieben
SetParent(VisPlgHandle, AppParentHandle);
// Das FensterHandle HWND des Plugins der Hauptanwendung
// für weitere, dort ausgeführte funktionen übermitteln.
Repeat
PluginHandle := GetWindow(VisInfo^.VisModule^.hwndParent, GW_HWNDPREV);
until PluginHandle <> 0;
IsPlaying := 1;
if IsPlaying > 0
then
VisInfo^.Init2 := True
else
VisInfo^.Init2 := False;
while (GetMessage(Msg, 0, 0, 0))
do
begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
VisInfo^.Init2 := False;
UnregisterClass(AppClass, 0);
W_RemoveHandle(DWORD(VisInfo));
VisInfo^.VisModule^.Quit(VisInfo^.VisModule);
DestroyWindow(VisInfo^.WinHandle);
if (VisInfo^.Title <>
nil)
then
StrDispose(VisInfo^.Title);
FreeLibrary(VisInfo^.DllInstance);
FreeMem(VisInfo);
VisInfo^.WinHandle := 0;
Result := 0;
end;