Thema: Delphi Probleme mit Bass_Vis

Einzelnen Beitrag anzeigen

BassFan
(Gast)

n/a Beiträge
 
#47

Re: Probleme mit Bass_Vis

  Alt 13. Jul 2006, 01:07
Habe mal ne Frage?

Ich benutze die BassVis ja in meinen projekt.
Wenn die DLL startet wird ein Winamp Dummy Fenster erstellt.
Plugins welche eine Dock funktion benutzen setzen sich dann sofort an das nicht sichtbare Fenster
was aber nicht das Fenster meiner Anwendung ist.

Deshalb hole ich über Findwindow das Handle des Dummy Window und
positioniere das Dummy Window mit SetWindowPos in verbindung mit SetParent in mein Hauptfenster ein.

Jetzt kommt das Problem!
Wenn ich die alte Routine aufrufe vom BassVis habe ich festgestellt das beim start
das Plugin nicht schnell genug an mein Hauptfenster andocken kann weil ich das Dummy Window
erst identifizieren kann sobald das Plugin gestartet ist!

Gut soweit.
Habe nun eine Routine hinzugefügt welche es ermöglicht unabhängig vom Plugin
das Dummy Window zu erstellen.

Delphi-Quellcode:
function WinampDummyWin(VisInfo: PWinampVisInfo): HWND;
var
   WinAtom : TAtom;
   wClass : TWNDCLASSEX;
   Msg : TMsg;

const
   AppClass = 'Winamp v1.x'; // Übergebe den ClassenNamen
   AppTitle = 'Winamp 5.2'; // Übergebe den Window Titel (Caption)

begin
   if DummyWinampHandle <> 0 then // Erstelle das Fake Winamp Fenster
   begin
      windows.UnRegisterClass(AppClass, hInst);
      hInst := 0;
      DummyWinampHandle := 0;
      VisInfo^.WinHandle := 0;
   end;

   hInst := GetModuleHandle(nil); // Hole die Apllikations Instanz

   with wClass do // Erstelle die Classe
   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;

  // Erst wenn die Classe registriert ist kann das Window erstellt werden
   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;

  DummyWinampHandle := result;
  VisInfo^.WinHandle := DummyWinampHandle;
  // Erst der AppClass das ParentWindow zuweisen
  // Dann über ParentWindow das HWND des Plugin ermitteln
  PluginHandle := GetWindow(DummyWinampHandle,GW_HWNDPREV);
  WinProcLoad := False;

  // Überprüfe ob aus der Anwendung IsPlaying eingeschaltet wurde.
  // Erst dann wird die Visualisierung freigeschaltet.
  if IsPlaying > 0 then
         VisInfo^.Init2 := True
    else
         VisInfo^.Init2 := False;

    sleep(150);
    peekmessage(Msg, 0, 0, 0, 0);

end;
Dort wird das Window generiert.

Um die Function abzuschließen muss ich auf die Rückgabe der Message warten.
GetMessage(Msg, 0, 0, 0) Hier hängt sich das Plugin aber auf!
Habe es nu so gelößt.

Delphi-Quellcode:
    sleep(150);
    peekmessage(Msg, 0, 0, 0, 0);
Nun warte ich 150 msec und hole mir dann die Infos über PeekMessage

Nun die Frage .. hihihihihhiihihih

Geht das anders ? Komfortabler ? Denke es ist kein guter Ansatz über die Sleep Methode
Anders habe ich den Kuchen aber nicht gebacken bekommen.
Ich darf aber auf keinen Fall in dieser Funktion hängen bleiben bzw.. die abfrage der Message muss beendet werden.
Die Funktion selbst wird nur einmal beim start der BassVis ausgeführt.

Für die Plugins gibt es nochmal eine ähnlich Funktion.

grüße

EDIT: Soviel Text für ein so kleines Problem ...
  Mit Zitat antworten Zitat