IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

API, COM et SDKs Delphi Discussion :

TWindowsMediaPlayer en mode plein éran ?


Sujet :

API, COM et SDKs Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé

    Homme Profil pro
    Informaticien retraité
    Inscrit en
    Mars 2010
    Messages
    369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Informaticien retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 369
    Billets dans le blog
    1
    Par défaut TWindowsMediaPlayer en mode plein éran ?
    J'espère que j'ai placé mon message dans la bonne rubrique.
    Sinon, je présente par avance mes excuses aux modérateurs qui
    voudront bien placer mon message dans la bonne rubrique.

    Ma configuration:
    PC portable sous Windows 8.1
    Delphi 6 Personal Edition
    TWindowsMediaPlayer 12.0.9600.17031 (dernière version à ma connaissance)

    Mon projet:
    Développement d'une vaste DLL gérant, entre autres, l'objet TWindowsMediaPlayer
    de sorte à pouvoir injecter de multiples players dans une fenêtre d'un programme externe.
    Tous ces players sont créés en cours d'exécution et jouent simultanément des contenus différents.

    Tout cela marche très bien. Un seul point pose problème: mettre un des players en mode "plein écran".
    J'ai passé des jours à chercher sur le net. J'ai trouvé quelques propriétés ou méthodes de TWindowsMediaPlayer
    qui auraient pu constituer une solution (Fullspace, DisplayRect, ...), mais tout est refusé par le compilateur
    comme mot-clé inconnu.

    Alors, j'ai fini par trouver cette méthode utilisant les services OLE:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    procedure SmoothResizeMediaPlayer(aMediaPlayer: TWindowsMediaPlayer; PosRect,ClipRect:Trect);
    const
      IID_IOleInPlaceObject: SYSTEM.TGUID = '{00000113-0000-0000-C000-000000000046}';
    var
      IOIPObj: IOleInPlaceObject;
    begin
      SYSTEM.IDispatch(aMediaPlayer.OleObject).QueryInterface(IID_IOleInPlaceObject, IOIPObj);
      IOIPObj.SetObjectRects(PosRect, ClipRect);
    end;
     
    function CreateMultiPlayer(wnd: HWND; tp,lft,w,h: integer): integer; stdcall; export;
    var
      XP: TWindowsMediaPlayer;
    begin
      result := -1;
      try
        XP := TWindowsMediaPlayer.Create(frm2DLLForm);
        XP.Top := tp;
        XP.Left := lft;
        XP.Width := w;
        XP.ParentWindow := wnd;
        result := integer(XP);
      except
      end;
    end;
     
    function ResizeMultiPlayer(player,t,l,w,h: integer): integer; stdcall; export;
    var
      r: TRect;
      XP: TWindowsMediaPlayer;
      a,b,c,d: integer;
      s: WideString;
    begin
      result := 0;
      XP := TWindowsMediaPlayer(player);
      if not assigned(XP) then exit;
      MyClientRect(XP.ParentWindow, r);
      SmoothResizeMediaPlayer(XP, r, r);
    end;
    La procédure SmoothResizeMediaPlayer est prise sur le net, sans modification.

    La fonction CreateMultiPlayer est écrite par moi. Elle fait partie de la DLL et est chargée
    de créer tous ces players multiples. Elle fonctionne parfaitement.

    La fonction ResizeMultiPlayer est écrite par moi et fait partie de la DLL.
    Le premier paramètre "player" est l'objet TWindowsMediaPlayer créé dans la fonction CreateMultiPlayer
    et passé au programme appelant. Ceci me permet de passer cette valeur à toutes les fonctions
    gérant les multiples players pour sélectionner celui que lequel il faut agir.

    La fonction ResizeMultiPlayer commence par créer un TRect nommé "r" qui contient les dimensions
    de la zone client de la fenêtre contenant le player ciblé. J'ai vérifié: les valeurs sont correctes.
    La procédure SmoothResizeMediaPlayer redimensionne effectivement le contrôle ActiveX aux bonnes domensions,
    MAIS: la vidéo elle-même reste à la même taille, positionnée au centre d'une zone noire remplissant toute
    la zone client ciblée. Or, je voulais que la vidéo elle-même soit étirée à ces dimensions, pas uniquement
    l'espace qu'occupe le contrôle ActiveX.

    J'ai essayé LIBVLC.dll avec le wrapper PASLIBVLC.pas. Et là, ça marche sans problème.
    Mais ayant déjà investi beaucoup de temps et efforts sur TWindowsMediaPlayer, j'apprécierais vraiment
    trouver une solution, soit par une méthode ou propriété de TWindowsMediaPlayer, soit par une
    technique OLE.

    Merci beaucoup de votre aide.

  2. #2
    Membre Expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2013
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 563
    Par défaut
    Bonjour !

    Je n'ai pas regardé le code en détail, mais envoyer une entrée clavier pour demander la mise en plein écran pourrait fonctionner?

    Pour ma part je travail sur une appli visant à simuler une entrée clavier sur une application et ces lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SetForegroundWindow(wHandleFenetre);
    keybd_event(VK_F4,0,0,0);
    me permettent d'envoyer un 'F4' à la fiche en cours, désignée par SetForegroundWindows...

    Après je suis encore débutant sur ce language, il y a peut être des solutions plus adaptées !

  3. #3
    Membre éclairé

    Homme Profil pro
    Informaticien retraité
    Inscrit en
    Mars 2010
    Messages
    369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Informaticien retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 369
    Billets dans le blog
    1
    Par défaut
    Merci pour ta suggestion, ZenZiTone. Mais ce n'est pas la solution. Même frappée au clavier manuellement, la touche F4 n'a aucun effet.

    En fait, il s'agit d'un contrôle ActiveX (TWindowsMediaPlayer) fourni par MicroSoft et disponible partout où il y a un Media Player de MicroSoft. A partir d'une DLL écrite en Delphi 6, j'injecte ce contrôle dans une fenêtre (ou un panel) d'un programme externe, réalisé dans un autre langage. Ce contrôle se pilote en utilisant ses propriétés et méthodes, à partir de la DLL. Il est également possible d'agir via le mécanisme OLE. Mais malheureusement, malgré des recherches intensives, je n'ai pas trouvé de documentation sur cette dernière possibilité. Je parle ici bien sûr des commandes OLE spécifiques au TWindowsMedisBrowser, pas le mécanisme OLE en général. La seule chose que j'aie trouvée dans ce domaine, c'est l'astuce que j'emploie actuellement et que j'ai publiée ci-dessus, mais elle ne résoud pas tout, et c'est le sujet de ma question initiale.

  4. #4
    Membre Expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2013
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 563
    Par défaut
    Le 'F4' est un exemple d'un code que j'ai !

    Pour le plein écran c'et Ctrl+Entrée.

  5. #5
    Membre éclairé

    Homme Profil pro
    Informaticien retraité
    Inscrit en
    Mars 2010
    Messages
    369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Informaticien retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 369
    Billets dans le blog
    1
    Par défaut
    Le résultat est le même: le controle ActiveX de TWindowsMediaPlayer ne réagit pas à ça.

  6. #6
    Membre éclairé

    Homme Profil pro
    Informaticien retraité
    Inscrit en
    Mars 2010
    Messages
    369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Informaticien retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 369
    Billets dans le blog
    1
    Par défaut
    Personne n'a une idée pourquoi la fenêtre de visualisation du TWindowsMediaPlayer passe bien en mode "full screen", mais le rectangle effectif d'affichage de la vidéo reste de taille identique, en remplissant le reste de la fenêtre de visualisation avec la couleur noire ? C'est très frustrant ! Ca se passe dans la procédure SmoothResizeMediaPlayer contenue dans le petit code que j'ai posté initialement. J'ai pris cette procédure sur internet et je l'ai intégrée sans aucune modification.

  7. #7
    Membre Expert

    Homme Profil pro
    au repos
    Inscrit en
    Février 2014
    Messages
    429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : au repos

    Informations forums :
    Inscription : Février 2014
    Messages : 429
    Par défaut
    Bonjour,

    As-tu essayé la propriété StretchToFit (en initialisant à true) ?

    http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx

    Thierry

  8. #8
    Membre éclairé

    Homme Profil pro
    Informaticien retraité
    Inscrit en
    Mars 2010
    Messages
    369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Informaticien retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 369
    Billets dans le blog
    1
    Par défaut
    Oui. Le compilateur refuse en signalant:
    Errreur ...[7374] Identificateur non déclaré: 'StretchToFit'

    C'était la raison pour laquelle je suis allé chercher cette monstruosite de ComObject...

  9. #9
    Membre Expert

    Homme Profil pro
    au repos
    Inscrit en
    Février 2014
    Messages
    429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : au repos

    Informations forums :
    Inscription : Février 2014
    Messages : 429
    Par défaut
    Je viens de tester sous Delphi7 édition perso.
    Simplement en déclarant l'unité WMPLib_TLB , cela marche.
    Je te confirme que c'est bien StretchToFit qui adapte la video à la taille du player.

    code test : un simple copier-coller de https://forums.embarcadero.com/threa...threadID=86936 (à la fin)

    Thierry

  10. #10
    Membre éclairé

    Homme Profil pro
    Informaticien retraité
    Inscrit en
    Mars 2010
    Messages
    369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Informaticien retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 369
    Billets dans le blog
    1
    Par défaut
    Malheureusement, j'ai déjà ce module dans la clause USES. Et pourtant, lors de la compilation, j'ai une erreur.

    J'uitilise Delphi 6.0 Peronal Edition Build 6.163.
    Je suis sous W8.1 .
    Est-ce Delphi qui ne le reconnait pas, ou est-ce que j'ai une trop ancienne version de WMPLib_TLB ? Je lis sur le net que WMPLib_TLB.pas est généré par le contrôle ActiveX TWindowsMediaPlayer. Est-ce que mon contrôle est trop ancien ? Et si oui, où est-ce que je peux charger la bonne version ?

    Klaus

  11. #11
    Membre Expert

    Homme Profil pro
    au repos
    Inscrit en
    Février 2014
    Messages
    429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : au repos

    Informations forums :
    Inscription : Février 2014
    Messages : 429
    Par défaut
    Pour pouvoir faire le test, j'ai dû importer le contrôle ActiveX (menu composant/importer...créer unité).
    L'unité WMPLib_TLB a alors été générée à partir de la bibliothèques de types wmp.dll (+ stdole2.tlb), se trouvant dans dossier windows\system32 (mon delphi7 est sur un PC toujours sous XP).
    Ceci est indiqué dans les commentaires au début de l'unité.

    Jette un coup d'oeil sur le code de l'unité. Regarde sa date de création (vérifie au passage la déclaration de la propriété StretchToFit).

    Thierry

  12. #12
    Membre éclairé

    Homme Profil pro
    Informaticien retraité
    Inscrit en
    Mars 2010
    Messages
    369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Informaticien retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 369
    Billets dans le blog
    1
    Par défaut
    Au début de l'unité, je trouve ceci:
    // PASTLWTR : $Revision: 1.130 $
    // Fichier généré le 31/07/2012 01:26:17 depuis la bibliothèque de types ci-dessous.

    // ************************************************************************ //
    // Type Lib: C:\WINDOWS\system32\wmp.dll (1)
    // LIBID: {6BF52A50-394A-11D3-B153-00C04F79FAA6}
    // LCID: 0
    Il n'y a aucune chaîne de caractères "StretchToFit" dans ce fichier. Donc, le compilateur a raison.

    J'ai effectivement copié ces fichiers de mon ancien XP lorsque je suis passé sous W8 et lorsque j'ai réinstallé Delphi 6.0 Personal Edition.
    Il y a aussi un fichier WMP.dll dans ...Windows\system32\.
    Mes 3 fichiers WMPlib_tmp (.dcr, .dci et .pas) sont dans C:\Program Files (x86)\Borland\Delphi6\Imports\. Est_ce que je dois désinstaller mon contrôle WMP, supprimer ces fichiers, puis réinstaller un WMP à partir de Windows\system32\WMP.dll ?

  13. #13
    Membre Expert

    Homme Profil pro
    au repos
    Inscrit en
    Février 2014
    Messages
    429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : au repos

    Informations forums :
    Inscription : Février 2014
    Messages : 429
    Par défaut
    Oui, je ne vois pas d'autre solution que de reconstruire l'unité à partir de la dll dans system32.

    Bon courage.

    Thierry

  14. #14
    Membre éclairé

    Homme Profil pro
    Informaticien retraité
    Inscrit en
    Mars 2010
    Messages
    369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Informaticien retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 369
    Billets dans le blog
    1
    Par défaut
    Bon, me voici au rapport.

    J'ai dû faire quelques erreurs, car lors de l'installation de l'activeX WMP.dll, en compilation, j'ai eu le message "invalid USES clause" concernant le module dcl..., et je n'ai pas trouvé le moyen de m'en sortir.

    Donc, désinstallation complète de Delphi, puis réinstalation. Sans problème.

    Puis, ajout de l'activeX TwindowsMediaPlayer (WMP.dll), cette fois, par précaution, sans un paquet séparé WMP. Sans problème. Le player apparaît bien dans l'onglet ActiveX, il peut être inséré dans une form en conception, et manipulé autant par la fenêtre des propriétés qu'en exécution par les propriétés et méthodes.

    Mais:
    La méthode StretchToFit n'est toujours pas reconnue par le compilateur. Et cette fois, elle est bien présente dans le fichier \imports\WMPLib_TLB.pas. C'est à ne rien y comprendre. Et il ne figure nulle part ailleurs dans l'arborescence Delphi6.

    J'ai ajouté en pièce jointe le source du fichier WMPLib_TLB.pas. Je ne comprends pas ce que j'ai raté.

    Merci de ton aide précieuse !
    Klaus
    Fichiers attachés Fichiers attachés

  15. #15
    Membre Expert

    Homme Profil pro
    au repos
    Inscrit en
    Février 2014
    Messages
    429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : au repos

    Informations forums :
    Inscription : Février 2014
    Messages : 429
    Par défaut
    Oui StretchToFit est bien présent dans l'unité, mais dans la déclaration des interfaces ! Pas en tant que propriété publique ou publiée du composant WMP.

    Voici une unité trouvée sur le web : http://code.google.com/p/cubicexplor...c=svn271&r=271
    On ne sait jamais qu'elle tournerait sous 8.1 !

    Désolé, mais là, je n'ai plus d'autres solutions à te proposer.

    Thierry

  16. #16
    Membre éclairé

    Homme Profil pro
    Informaticien retraité
    Inscrit en
    Mars 2010
    Messages
    369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Informaticien retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 369
    Billets dans le blog
    1
    Par défaut
    J'ai fait de multiples essais.

    J'ai remplacé mon fichier TLB par celui indiqué par ton lien. Mais il y a un problème: ce fichier est clairement beaucoup plus ancien, et n'est plus en phase avec le TWindowsMediaPlayer actuel. Il y a bien StretchToFit et FullSpace, mais d'autres options manquent ou sont différentes.

    Je suis donc revenu à ma version actuelle qui correspond au WMP distribué avec mon système. Et voici ce qu'il m'indique:
    // PASTLWTR : $Revision: 1.130 $
    // Fichier généré le 12/05/2014 01:25:41 depuis la bibliothèque de types ci-dessous.
    Et le fichier fourni par ton lien:
    // PASTLWTR : 1.2
    // File generated on 24.8.2009 22:20:31 from Type Library described below.
    Donc, je suis malheureusement revenu à mon point de départ.

    Les méthodes ou propriétés StretchToFit et FullSpace existent bien dans le fichier que j'ai joint à mon précédent message. Comment puis-je les rendre accessibles, au moins en exécution ? La partie conception ne m'intéresse pas particulièrement.

    Klaus

  17. #17
    Membre Expert

    Homme Profil pro
    au repos
    Inscrit en
    Février 2014
    Messages
    429
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : au repos

    Informations forums :
    Inscription : Février 2014
    Messages : 429
    Par défaut
    Comme je te l'ai dit, dans ton unité, les fonctions ne sont accessibles que par l'interface utilisé par TWindowsMediaPlayer.
    Celui-ci a bien les propriétés ControlInterface et Defaultinterface, mais comment les utiliser ?
    WMP.ControlInterface.StretchToFit : ok en debug, mais erreur à l'exécution.

    Je crois que tu ferais bien de poser sur le forum une question précise à ce sujet.
    Toujours en spécifiant que tu es toujours sous Delphi 6 avec OS W8.1, ce qui peut être la cause du problème dans la création de l'unité.

    Thierry

  18. #18
    Membre éclairé

    Homme Profil pro
    Informaticien retraité
    Inscrit en
    Mars 2010
    Messages
    369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Informaticien retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 369
    Billets dans le blog
    1
    Par défaut
    WMP.ControlInterface.StretchToFit : ok en debug, mais erreur à l'exécution.
    Chez moi, il y a bien ControlInterface, mais WMP.ControlInterface.StretchToFit n'est pas reconnu chez moi. Lié à Delphi 6 ? je n'en sais rien.

    Je vais tenter de poser une queston spécifique selon ton conseil.

    Klaus

  19. #19
    Membre éclairé

    Homme Profil pro
    Informaticien retraité
    Inscrit en
    Mars 2010
    Messages
    369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Informaticien retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 369
    Billets dans le blog
    1
    Par défaut
    Un grand MERCI de ton aide. Suite à ton conseil, j'avais posté une demande spécifique, et Ph.B. vient de résoudre mon problème, avec in lien vers une unité contenant un TWindowsMediaPlayer personnalisé contenant les propriétés dont j'avais besoin. Il m'a aussi aidé pour l'utilisation de cette unité.

    Merci pour la grande patience et la compétence de tous les intervenants !

  20. #20
    Membre éclairé

    Homme Profil pro
    Informaticien retraité
    Inscrit en
    Mars 2010
    Messages
    369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Informaticien retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2010
    Messages : 369
    Billets dans le blog
    1
    Par défaut
    Problème résolu ! Merci !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. souci mode plein ecran
    Par tibiurs dans le forum Access
    Réponses: 4
    Dernier message: 21/01/2006, 15h20
  2. Formulaires en mode plein écran
    Par PAUL87 dans le forum IHM
    Réponses: 18
    Dernier message: 26/11/2005, 11h45
  3. Presentation d'un formulaire en mode plein écran
    Par PAUL87 dans le forum Access
    Réponses: 4
    Dernier message: 13/11/2005, 20h04
  4. mode plein écran
    Par Rinoud dans le forum Agents de placement/Fenêtres
    Réponses: 8
    Dernier message: 30/09/2004, 01h04
  5. Réponses: 17
    Dernier message: 17/10/2002, 20h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo