begin process at 2012 02 09 01:14:31
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C#

 > 

Multimédia

 > 

DirectX

 > 

Vidéo sur bureau


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Vidéo sur bureau

vendredi 18 janvier 2008 à 20:35:24 | Vidéo sur bureau

Gendal67

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 ?

vendredi 18 janvier 2008 à 22:51:16 | Re : Vidéo sur bureau

Julien237

Salut,
Tu peux récupérer le contexte graphique si tu as le handle :
[ Lien ]
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.
vendredi 18 janvier 2008 à 22:55:41 | Re : Vidéo sur bureau

Gendal67

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 ?

samedi 19 janvier 2008 à 10:07:47 | Re : Vidéo sur bureau

Julien237

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.
samedi 19 janvier 2008 à 19:37:47 | Re : Vidéo sur bureau

Gendal67

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 !

samedi 19 janvier 2008 à 22:15:39 | Re : Vidéo sur bureau

Julien237

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.
samedi 19 janvier 2008 à 23:37:04 | Re : Vidéo sur bureau

Julien237

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.
dimanche 20 janvier 2008 à 03:04:28 | Re : Vidéo sur bureau

Gendal67

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

dimanche 20 janvier 2008 à 09:24:09 | Re : Vidéo sur bureau

Julien237

"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.
dimanche 20 janvier 2008 à 16:48:49 | Re : Vidéo sur bureau

Gendal67

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



Cette discussion est classée dans : bureau, control, vidéo, vlc


Répondre à ce message

Sujets en rapport avec ce message

Capturer une vidéo du bureau ? [ par t0fx ] Salut tout le monde ! Connaissez-vous un moyen d'enregistrer une vidéo de son bureau ? Faire des screenshots en .bmp ya pas de problèmes, mais quand à ActiveX vlc [ par goffle ] Bonjour, Je souhaiterais réaliser une application permettant d'envoyer un flux vidéo en C#. Je programme sous Visual studio 2008. J'ai installer le Control boule pour rotations [ par Kite37 ] Bonjour, J'avais vu il y a quelques temps (je ne sais plus exactement si s'était bien sur CS) un control très intéressant. Il s'agissait d'une boule instances User Control Winform [ par doudouastam ] Bonjour à tous, Je suis en train de créer un Winform. A l'intérieur du formulaire ("form" de base), navigation par onglet. Je travaille sur un seul o Dependency property [ par Kite37 ] Bonjour ! J'ai créé récemment un user control (encore un) et j'ai tenté d'implémenter au maximum des dependency property avec ses accesseurs, afin de Lire video hébergée sur serveur [ par Grewdiv ] Bonjour. J'aimerais créer une application permettant de lire une vidéo qui serait hébergée sur un serveur (serveur que je possède). Pouvez vous m'or surcharge propriété visible d'un user control [ par johnnous ] bonjour j'ai un usercontrol qui hérite d'un button public class WopLightButton : System.Windows.Forms.Button et j'aimerais changer les propriétés de AJAX CONTROL TOOLKIT [ par 76julien ] Bonjour a tous, je souhaite télécharger AJAX control toolkit mais rien n'y fait. Quelqu'un peut-il m'indiquer une autre adresse que CodePlex car la je Problem avec l'Activex Vivotek RTSPVaPg [ par gouranos ] Bonjour, j'ai crée une simple Widows Form sous C#, le but est de pouvoir lire le flux video d'une camera IP Pan/Tilt Vivotek 7135. L'Activex RTS empecher redimensionnent en hauteur [ par jokary64 ] bonjour, Je voudrais refaire une textbox (pour y ajouter du controle de saisie, etc..). Pour cela j'ai créer un usercontrol et coller une textBox à


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,187 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales