Gendal67
Messages postés627Date d'inscriptionmercredi 16 juin 2004StatutMembreDernière intervention24 juillet 2011
-
18 janv. 2008 à 20:35
Gendal67
Messages postés627Date d'inscriptionmercredi 16 juin 2004StatutMembreDernière intervention24 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....
Julien237
Messages postés883Date d'inscriptionvendredi 3 novembre 2000StatutMembreDernière intervention 3 mars 20097 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...
Gendal67
Messages postés627Date d'inscriptionmercredi 16 juin 2004StatutMembreDernière intervention24 juillet 20112 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 ?
Julien237
Messages postés883Date d'inscriptionvendredi 3 novembre 2000StatutMembreDernière intervention 3 mars 20097 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...
Gendal67
Messages postés627Date d'inscriptionmercredi 16 juin 2004StatutMembreDernière intervention24 juillet 20112 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 !
Vous n’avez pas trouvé la réponse que vous recherchez ?
Julien237
Messages postés883Date d'inscriptionvendredi 3 novembre 2000StatutMembreDernière intervention 3 mars 20097 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...
Julien237
Messages postés883Date d'inscriptionvendredi 3 novembre 2000StatutMembreDernière intervention 3 mars 20097 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();
Gendal67
Messages postés627Date d'inscriptionmercredi 16 juin 2004StatutMembreDernière intervention24 juillet 20112 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
Julien237
Messages postés883Date d'inscriptionvendredi 3 novembre 2000StatutMembreDernière intervention 3 mars 20097 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...
Gendal67
Messages postés627Date d'inscriptionmercredi 16 juin 2004StatutMembreDernière intervention24 juillet 20112 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.