Vidéo sur bureau

Gendal67 Messages postés 627 Date d'inscription mercredi 16 juin 2004 Statut Membre Dernière intervention 24 juillet 2011 - 18 janv. 2008 à 20:35
Gendal67 Messages postés 627 Date d'inscription mercredi 16 juin 2004 Statut Membre Dernière intervention 24 juillet 2011 - 20 janv. 2008 à 16:48
Bonsoir tout le monde,

J'ai un petit souci. Je souhaiterais développer une application qui fasse comme VLC : afficher une vidéo en tant que papier peint du bureau. Les DLL de VLC n'étant pas des assemblys, impossible d'utiliser reflector.

Pour faire celà, j'ai quasiement tout qui fonctionne, sauf UNE chose : j'ai besoin d'obtenir un objet 'Control' qui représente mon bureau.
Evidemment, j'ai testé Control.FromHandle(GetDesktopWindow()) ... mais retourne toujours null....

Que faire ?

9 réponses

Julien237 Messages postés 883 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 3 mars 2009 7
18 janv. 2008 à 22:51
Salut,
Tu peux récupérer le contexte graphique si tu as le handle :
http://msdn2.microsoft.com/en-us/library/ms534830(VS.85).aspx
A partir de là tu en fais ce que tu veux : utiliser d'autres api (bitblt ...) pour y dessiner ce que tu veux, ou utiliser GDI+ via la classe Graphics qui comporte un constructeur prenant en paramètre un contexte graphique.
Si jamais GetWindowDC renvoie 0, c'est que le contexte graphique du bureau correspond à l'écran entier, ce qui n'est pas tout à fait ce que tu veux je présume, si c'est ce que ça renvoie, je ne sais pas t'aider...

Julien.
0
Gendal67 Messages postés 627 Date d'inscription mercredi 16 juin 2004 Statut Membre Dernière intervention 24 juillet 2011 2
18 janv. 2008 à 22:55
Merci de ta réponse,

Mais je ne vois pas quel sera l'interet de réaliser des opérations GDI sur mon handle (?) ...
Je cherche à mettre de la vidéo avec code C# en utilisant Microsoft.DirectX.jesaispluslenom .
Le choix de .NET est simple : directX permet facilement, avec simplicité, de jouer de la vidéo.... en C/C++ c'est un peu + mazo...

Est ce à partir du DC ou autre, j'ai un moyen de créer un controle WIndows Forms ?
TU as l'air de t'y connaitre, peux tu m'éclairer ?
0
Julien237 Messages postés 883 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 3 mars 2009 7
19 janv. 2008 à 10:07
Le DC c'est un handle qui permet à GDI ou a GDI+ de dessiner, c'est la brique de base du dessin sous windows. Tu n'avais pas parlé de DirectX, qui lui est encore sous cette architecture windows et pour qui le DC n'a en effet pas beaucoup de sens.
Mais tu essaies, si j'ai bien compris, de récupérer un objet contrôle pour pouvoir le transmettre au constructeur de l'objet Device de DirectX ?
Ce constructeur permet aussi de construire un Device sans objet contrôle en passant directement par le handle spécifié.
Je crois que c'est le 3e paramètre si je me rappelle bien, tu peux lui spécifier aussi bien un contrôle qu'un handle...

Julien.
0
Gendal67 Messages postés 627 Date d'inscription mercredi 16 juin 2004 Statut Membre Dernière intervention 24 juillet 2011 2
19 janv. 2008 à 19:37
Bonsoir,

J'ai développé en C/C++ avec les API Win32, je connais pas trop mal les DC ;)
Ce que je souhaite faire c'est utiliser l'objet Microsoft.DirectX.AudioVideoPlayback.Video.
Celui-ci possède un champ "Owner" de type Control qui identifie le contrôle parent.

J'avais tenté un Control.FromHandle(GetDesktopWindow()) ... mais retourne toujours null.... pourtant, GetDesktopWIndow() ne retourne pas un handle égale à 0 ou IntPtr.Zero !

C'est pour celà que j'en reste assez perplexe

Bonne soirée !
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Julien237 Messages postés 883 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 3 mars 2009 7
19 janv. 2008 à 22:15
Ah mince, je connais pas du tout ce coin là de DirectX, il te propose pas de le jouer sur autre chose ?

Sinon pour ce qui est de Control.FromHandle qui retourne zéro, tu dois surement le savoir mieux que moi si tu as fais du C++, c'est pas une histoire que le handle est une adresse mémoire qui n'a de sens que dans l'application qui l'a créé ? (Ou éventuellement via le système d'exploitation pour l'api windows)
D'après les vagues notions que j'ai de gestion de la mémoire par l'OS, je vois mal comment tu pourrais créer un objet en recevant un pointeur d'une application externe à ton programme puisqu'il s'agit d'une adresse de sa mémoire et non de la tienne.
Enfin je dis ça mais je ne connais pas les détails...

Julien.
0
Julien237 Messages postés 883 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 3 mars 2009 7
19 janv. 2008 à 23:37
J'ai trouvé comment faire un rendu à partir de l'objet Video et du seul handle, ça fonctionne dans mon form, mais une fois transposé sur le handle du bureau, rien ne se dessine :'(...
Voilà toujours le code :
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using Microsoft.DirectX.AudioVideoPlayback;
using Microsoft.DirectX.Direct3D;
using Microsoft.DirectX;

namespace DrawOnDesktop
{
    public partial class Form1 : Form
    {
        [DllImport("user32.dll")]
        public static extern IntPtr GetDesktopWindow();

        [DllImport("user32.dll")]
        public static extern bool InvalidateRect(IntPtr h, IntPtr r, bool b);

        Device myDevice;
        Video myVideo;
        Texture myTexture;
        CustomVertex.PositionTextured[] myVertices;

        public Form1()
        {
            InitializeComponent();

            myVideo = new Video("c:\\yop.avi", false);
            PresentParameters param = new PresentParameters();
            param.SwapEffect = SwapEffect.Discard;
            param.Windowed = true;
            myDevice = new Device(0, DeviceType.Hardware,
                Handle, CreateFlags.SoftwareVertexProcessing,
                param);
            myDevice.Transform.Projection = Matrix.PerspectiveFovLH(
                (float)Math.PI / 2, Width / Height, 0.1f, 100f);
            myDevice.Transform.View = Matrix.LookAtLH(new Vector3(0f, 0f, -1f),
                new Vector3(0f, 0f, 0f), new Vector3(0f, 1f, 0f));
            myDevice.Transform.World = Matrix.Identity;

            myVideo.RenderToTexture(myDevice);
            myVideo.TextureReadyToRender += new TextureRenderEventHandler(myVideo_TextureReadyToRender);

            myVertices = new CustomVertex.PositionTextured[4];
            myVertices[0] = new CustomVertex.PositionTextured(-1f, 1f, 1f, 0f, 0f);
            myVertices[1] = new CustomVertex.PositionTextured(1f, 1f, 1f, 1f, 0f);
            myVertices[2] = new CustomVertex.PositionTextured(1f, -1f, 1f, 1f, 1f);
            myVertices[3] = new CustomVertex.PositionTextured(-1f, -1f, 1f, 0f, 1f);

        }

        void myVideo_TextureReadyToRender(object sender, TextureRenderEventArgs e)
        {
            myTexture = e.Texture;
            myDevice.Clear(ClearFlags.Target, Color.Black, 1.0f, 0);
            myDevice.BeginScene();
            if (myTexture != null)
            {
                myDevice.RenderState.CullMode = Cull.None;
                myDevice.RenderState.Lighting = false;
                myDevice.SetTexture(0, myTexture);
                myDevice.VertexFormat = CustomVertex.PositionTextured.Format;
                myDevice.DrawUserPrimitives(PrimitiveType.TriangleFan,
                    2, myVertices);
            }
            myDevice.EndScene();
            myDevice.Present();
        }

    }
}

Sinon VLC, c'est pas OpenSource ?
Bonne chance

Julien.
0
Gendal67 Messages postés 627 Date d'inscription mercredi 16 juin 2004 Statut Membre Dernière intervention 24 juillet 2011 2
20 janv. 2008 à 03:04
Bonsoir,

"handle est une adresse mémoire qui n'a de sens que dans l'application qui l'a créé" <<< ah bon ? Si tu fais un FindWindow, tu peux récupérer un handle de fenêtre. C'est l'OS qui gère les HWND.
D'ailleurs, en récupérant un handle de fenêtre, je peux faire ce que je veux avec : fermer la fenetre, lui envoyer des messages Win32, réduire, etc.... seul problème, les opérations ne se font qu'en code Win32 au sein de mon code C# puisque je n'arrive  pas à convertir de IntPtr en quelque chose d'autre.  
Donc celà confirme bien ce que je pensais, c'est pas dépendant de l'application, et heuresement. Sinon pour envoyer des messages à une fenêtre d'un autre programme, ça paraitrait compromis... communicaiton inter-application via message tombe à l'eau.

Merci de ta source, mais mon code actuel me permet déjà d'afficher ma vidéo sur n'importe quel Control .NET  par contre toi tu as rajouté des trucs sur les vertex, intérésssant !

Encore merci de ton  aide... j'espère qu'on finira par trouver, c'est très curieux quand^même ce petit souci
0
Julien237 Messages postés 883 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 3 mars 2009 7
20 janv. 2008 à 09:24
"Si tu fais un FindWindow, tu peux récupérer un handle de fenêtre. C'est l'OS qui gère les HWND."
Oui tu récupère un handle avec findWindows, mais ce handle tu ne peux l'utiliser QUE via les apis, et donc à travers l'OS non ?
La communication via message est gérée par l'OS, ton message monte dans le noyau, windows détermine à quel processus appartient le handle du message, et lui envoie...

Sinon en cherchant un peu sur google, j'ai vu que la manière dont VLC ou le Milkdrop de Winamp se débrouillait pour dessiner sur le bureau était apparemment de faire une fenêtre plein écran sans bordure, puis qu'ils faisaient un SetParent avec le handle du bureau comme parent...
J'ai fait quelques tests mais rien de concluant... Ce qui m'échappe, c'est que dans ma tête toute fenêtre de "top-level" est déjà fille du bureau non ? Et j'ai pas compris non plus comment ils géraient les icônes là-dedans...

Ca m'énerve j'ai examen d'analyse après-demain et j'ai pas trop le temps, mais le sujet m'intéresse, je continuerai sans doute à chercher la semaine prochaine...

Julien.
0
Gendal67 Messages postés 627 Date d'inscription mercredi 16 juin 2004 Statut Membre Dernière intervention 24 juillet 2011 2
20 janv. 2008 à 16:48
Salut,

En effet pour l'histoire des handles, tu as raison, au temps pour moi...
Sinon, j'ai résolu mon souci... j'ai directement implémenter la vidéo en C/C++ à l'aide de la librairie VFW et ça tourne bien.
La vidéo se joue sur le bureau... seul bémol... elle s'affiche par dessus les icones !
Dernier souci donc à régler, mais comme maintenant entièrement projet C/C++, ce n'est plus le bon forum pour celà

Merci en tout cas de ton aide !
Si tu souhaites la source, no souci, send message privé avec ton mail/MSN, et je te l'enverrai.

Bien amicalement,
Gendal67
0
Rejoignez-nous