Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi WindowHandle vom Aktiven Renderer (https://www.delphipraxis.net/197875-windowhandle-vom-aktiven-renderer.html)

EWeiss 13. Sep 2018 14:27

WindowHandle vom Aktiven Renderer
 
Ich mache folgendes..

Delphi-Quellcode:
function TEVMRPlayer.GetWindowHandle: HWND;
var
  pPin: IPIN;
  VideoRenderer: IBaseFilter;
  Overlay: IOverlay;
  HR: HRESULT;
begin

  Result := 0;

  GraphBuilder.FindFilterByName(PWideChar(FVideoRenderer.VMRFilter), VideoRenderer);
  if Assigned(VideoRenderer) then
  begin
    HR := VideoRenderer.FindPin(nil, pPin);

    if (SUCCEEDED(HR)) then
    begin
      pPin.QueryInterface(IID_IOverlay, Overlay);
      Overlay.GetWindowHandle(Result);
    end;
  end;
end;
FVideoRenderer.FilterName ist in dem Fall "madVR"
VideoRenderer liefert einen Zeiger ist also nicht Nil.

aber trotzdem kracht es hier
Delphi-Quellcode:
VideoRenderer.FindPin(nil, pPin);


verstehe nicht warum.. jemand eine Idee?

gruss

KodeZwerg 13. Sep 2018 14:36

AW: WindowHandle vom Aktiven Renderer
 
https://stackoverflow.com/questions/...he-id-returned

Ich hoffe das hilft Dir.

EWeiss 13. Sep 2018 14:50

AW: WindowHandle vom Aktiven Renderer
 
Zitat:

Zitat von KodeZwerg (Beitrag 1413127)

Leider nicht.
Andere Version.. das gleiche.

Delphi-Quellcode:
function TEVMRPlayer.GetWindowHandle: HWND;
var
  pPin: IPin;
  VideoRenderer: IBaseFilter;
  Overlay: IOverlay;
  HR: HRESULT;
begin

  Result := 0;
  pPin := nil;

//  GraphBuilder.FindFilterByName(PWideChar(FVideoRenderer.VMRFilter), VideoRenderer);
//  if Assigned(VideoRenderer) then
//  begin
    HR := FVideoRenderer.VMRFilter.FindPin(nil, pPin);

    if (SUCCEEDED(HR)) then
    begin
      pPin.QueryInterface(IID_IOverlay, Overlay);
      Overlay.GetWindowHandle(Result);
    end;
//  end;
end;
HR Fails bei EVRBaseFilter.. und kracht bei madVRFilter
Der sinn des ganzen ich benötige das WindowHandle des aktiven Rendere um ein Window drüberzulegen ohne jetzt extra ein zusätzliches Overlay zu generieren.

ERROR = "Ein Object oder Name wurde nicht gefunden."
madVRFilter ist valid.. Welches Object oder Name sollte dann da nicht gefunden werden?

gruss

EWeiss 14. Sep 2018 06:20

AW: WindowHandle vom Aktiven Renderer
 
Hat sich erledigt.
Ein einfaches WindowFromPoint tut's auch.
Wollte es wieder mal zu professional machen.. na was soll's

Trotzdem seltsam das es nicht funktioniert hat.

gruss

TiGü 14. Sep 2018 08:38

AW: WindowHandle vom Aktiven Renderer
 
Zitat:

Zitat von EWeiss (Beitrag 1413123)
aber trotzdem kracht es hier
Delphi-Quellcode:
VideoRenderer.FindPin(nil, pPin);
verstehe nicht warum.. jemand eine Idee?

Auch wenn für dich das Thema schon abgeschlossen ist, hier noch die Erklärung:
Die offizielle Dokumention sagt, dass der erste Parameter einen String(-Zeiger) enthalten muss, der den Pin identifiziert (https://docs.microsoft.com/en-us/win...filter-findpin).
Wenn du da jetzt nil übergibst, versucht die implementierende Methode FindPin auf den Speicherbereich zuzugreifen -> es kracht!

Im von Zwerg verlinkten SO-Beitrag ist ein Beispiel für das Enummerieren der Pins der übergebenen IBaseFilter-Instanz.
Baue dir einen ähnlichen Code mit ein und lasse dir per OutputDebugString ausgeben, wie die korrekten Namen sind.

EWeiss 14. Sep 2018 08:58

AW: WindowHandle vom Aktiven Renderer
 
Zitat:

Baue dir einen ähnlichen Code mit ein und lasse dir per OutputDebugString ausgeben, wie die korrekten Namen sind.
Habe ich versucht und bekomme auch den Pin.
Nur es kracht trotzdem ;)

Delphi-Quellcode:
function FindConnectedPin(pFilter: IBaseFilter; PinDir: PIN_DIRECTION; var ppPin: IPin): HRESULT;
var
  pEnum: IEnumPins;
  pPin: IPin;
  hr: HRESULT;
  bFound: BOOL;
  bIsConnected: BOOL;

begin
  ppPin := nil;

  pEnum := nil;
  pPin := nil;

  hr := pFilter.EnumPins(pEnum);
  if (FAILED(hr)) then
  begin
    result := hr;
    exit;
  end;

  bFound := FALSE;
  while (pEnum.Next(1, pPin, nil) = S_OK) do
  begin
    hr := IsPinConnected(pPin, bIsConnected);
    if (SUCCEEDED(hr)) then
    begin
      if (bIsConnected) then
        hr := IsPinDirection(pPin, PinDir, bFound);
    end;

    if (FAILED(hr)) then
    begin
      pPin := nil;
      break;
    end;
    if (bFound) then
    begin
      ppPin := pPin;
      break;
    end;

    pPin := nil;
  end;

  pEnum := nil;

  if (not bFound) then
    hr := VFW_E_NOT_FOUND;

  result := hr;
end;
Delphi-Quellcode:
FindConnectedPin(FVideoRenderer.VMRFilter, PINDIR_INPUT, pPin);


Delphi-Quellcode:
pPin.QueryInterface(IID_IOverlay, Overlay);

Overlay ist Nil trotz gefundenen Pin und dann kracht es natürlich. (wenn nicht abgesichert)

gruss

TiGü 14. Sep 2018 09:19

AW: WindowHandle vom Aktiven Renderer
 
Zitat:

Zitat von EWeiss (Beitrag 1413173)
Delphi-Quellcode:
pPin.QueryInterface(IID_IOverlay, Overlay);

Overlay ist Nil trotz gefundenen Pin und dann kracht es natürlich. (wenn nicht abgesichert)

Aufgrund welcher Quelle gehst du davon aus, dass die Instanz des Pins das IOverlay-Interface implementiert?

EWeiss 14. Sep 2018 09:35

AW: WindowHandle vom Aktiven Renderer
 
Zitat:

Zitat von TiGü (Beitrag 1413174)
Zitat:

Zitat von EWeiss (Beitrag 1413173)
Delphi-Quellcode:
pPin.QueryInterface(IID_IOverlay, Overlay);

Overlay ist Nil trotz gefundenen Pin und dann kracht es natürlich. (wenn nicht abgesichert)

Aufgrund welcher Quelle gehst du davon aus, dass die Instanz des Pins das IOverlay-Interface implementiert?

Davon das ich weis das MadVr es tut.
Sonst könnte ich ja kein Overlay in Fenster anzeigen oder liege ich da falsch?
Notfalls könnte ich das Overlay Interface bei der Initialisierung von Mad und den anderen Filtern noch hinzufügen.

gruss

TiGü 14. Sep 2018 09:41

AW: WindowHandle vom Aktiven Renderer
 
Zitat:

Zitat von EWeiss (Beitrag 1413175)
Zitat:

Zitat von TiGü (Beitrag 1413174)
Zitat:

Zitat von EWeiss (Beitrag 1413173)
Delphi-Quellcode:
pPin.QueryInterface(IID_IOverlay, Overlay);

Overlay ist Nil trotz gefundenen Pin und dann kracht es natürlich. (wenn nicht abgesichert)

Aufgrund welcher Quelle gehst du davon aus, dass die Instanz des Pins das IOverlay-Interface implementiert?

Davon das ich weis das MadVr es tut.
Sonst könnte ich ja kein Overlay in Fenster anzeigen oder liege ich da falsch?
Notfalls könnte ich das Overlay Interface bei der Initialisierung von Mad und den anderen Filtern noch hinzufügen.

Du könntest natürlich auch die Dokumentation der MSDN lesen:
https://docs.microsoft.com/en-us/win...trmif-ioverlay

In der Mitte des Textes (5. Absatz) findest du die Antwort auf die Frage:
"Wer implementiert das IOverlay und wem kann ich demzufolge per QueryInterface fragen?"

Spoiler: Es ist NICHT eine IPin-Instanz.

EWeiss 14. Sep 2018 09:43

AW: WindowHandle vom Aktiven Renderer
 
Zitat:

Zitat von TiGü (Beitrag 1413176)
Zitat:

Zitat von EWeiss (Beitrag 1413175)
Zitat:

Zitat von TiGü (Beitrag 1413174)
Zitat:

Zitat von EWeiss (Beitrag 1413173)
Delphi-Quellcode:
pPin.QueryInterface(IID_IOverlay, Overlay);

Overlay ist Nil trotz gefundenen Pin und dann kracht es natürlich. (wenn nicht abgesichert)

Aufgrund welcher Quelle gehst du davon aus, dass die Instanz des Pins das IOverlay-Interface implementiert?

Davon das ich weis das MadVr es tut.
Sonst könnte ich ja kein Overlay in Fenster anzeigen oder liege ich da falsch?
Notfalls könnte ich das Overlay Interface bei der Initialisierung von Mad und den anderen Filtern noch hinzufügen.

Du könntest natürlich auch die Dokumentation der MSDN lesen:
https://docs.microsoft.com/en-us/win...trmif-ioverlay

In der Mitte des Textes (5. Absatz) findest du die Antwort auf die Frage:
"Wer implementiert das IOverlay und wem kann ich demzufolge per QueryInterface fragen?"

Spoiler: Es ist NICHT eine IPin-Instanz.

Ok werde ich mal tun.. Danke!

gruss


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:00 Uhr.
Seite 1 von 3  1 23      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz