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

DirectX Discussion :

Gérer le ALT-TAB ?


Sujet :

DirectX

  1. #1
    Membre régulier
    Profil pro
    Ingénieur R&D
    Inscrit en
    Juillet 2002
    Messages
    81
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 81
    Points : 74
    Points
    74
    Par défaut Gérer le ALT-TAB ?
    Oui, comment faire ? Je veux permettre aux utilisateurs de mon programme de ALT-TABer (haha). Seulement, il y a une histoire de surfaces et de périphériques perdus (j'ai lu ça ailleurs, ils sont gentils, mais ils n'expliquent rien)... Aussi, j'ai lu qu'on peut réduire l'utilisation du processeur dans le cas où le programme est réduit (avec un Sleep).

  2. #2
    Membre régulier
    Inscrit en
    Mars 2002
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 97
    Points : 71
    Points
    71
    Par défaut
    Seulement, il y a une histoire de surfaces et de périphériques perdus
    dans les méthodes de programmation de Direct X que j'ai lu, ils précisaient dedans qu'ils fallaient prévoir la perte des surfaces, sons ou périphériques, et donc dans ce cas là recharger les élements perdus !
    mais ils précisaient pas dans quels cas intervenaient la perte, donc le ALT+TAB en fait pê partie !

    Aussi, j'ai lu qu'on peut réduire l'utilisation du processeur dans le cas où le programme est réduit (avec un Sleep).
    oui on peut ! tu fais une boucle qui teste si ton appli est revenu au premier plan, et en attendant tu met un sleep(x millisecondes) pendant lesquels tu n'utilises pas le proc !

  3. #3
    Membre régulier
    Profil pro
    Ingénieur R&D
    Inscrit en
    Juillet 2002
    Messages
    81
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 81
    Points : 74
    Points
    74
    Par défaut
    Alors, comment on fait, avec un code à l'appui ? (pour le Sleep, je savais, tout comme pour les surfaces perdues, mais ils n'expliquaient rien dans le doc que j'ai lu)

    Aussi, même avec DirectInput lancé et en mode exclusif, le ALT-TAB passe au travers... Comment on le récupère ?

  4. #4
    Membre régulier
    Inscrit en
    Mars 2002
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 97
    Points : 71
    Points
    71
    Par défaut
    faudras attendre ce soir pour que je te réponde, je regarderai comment j'ai fait dans mon code

  5. #5
    Membre régulier
    Profil pro
    Ingénieur R&D
    Inscrit en
    Juillet 2002
    Messages
    81
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 81
    Points : 74
    Points
    74
    Par défaut
    Yeah, cool! Thanks !

  6. #6
    Membre régulier
    Inscrit en
    Mars 2002
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 97
    Points : 71
    Points
    71
    Par défaut
    pour récupérer les périph de DInput, exemple avec le clavier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    if(pClavier->GetDeviceState(sizeof(DIDEVICEOBJECTDATA), &data) == DIERR_INPUTLOST)
    {
     if(pClavier->Acquire() == DI_OK)
     {
      ...
      }
    }
    pour DirectDraw, c'est le même fonctinnement sauf que j'ai pas d'exemple car je ne le gère pas avec mon prog

    j'espère que ça t'aidera

  7. #7
    Membre régulier
    Profil pro
    Ingénieur R&D
    Inscrit en
    Juillet 2002
    Messages
    81
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 81
    Points : 74
    Points
    74
    Par défaut
    Sauf que c'est Direct3D, pas DirectDraw. Enfin, thanks! Mais pour le Sleep ? Comment je détectes si le programme passe en arrière-plan ?

  8. #8
    Membre régulier
    Inscrit en
    Mars 2002
    Messages
    97
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 97
    Points : 71
    Points
    71
    Par défaut
    Sauf que c'est Direct3D, pas DirectDraw
    arf j'avais oublié
    Comment je détectes si le programme passe en arrière-plan ?
    bonne question
    à mon avis tu devrais la poser sur le forum "c++" ou faire une recherche dessus, je pense que ça doit passer sous forme de message de windows.

  9. #9
    Membre expérimenté

    Profil pro
    Programmeur
    Inscrit en
    Août 2002
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Programmeur

    Informations forums :
    Inscription : Août 2002
    Messages : 1 091
    Points : 1 679
    Points
    1 679
    Par défaut
    Citation Envoyé par Dave
    Sauf que c'est Direct3D, pas DirectDraw. Enfin, thanks! Mais pour le Sleep ? Comment je détectes si le programme passe en arrière-plan ?
    tu crees un booleen au niveau de ton application qui
    te dis son ton application est 'ready' ou pas
    dans ta boucle principale tu lis tes messages, si ton application est 'ready', tu fais juste un appel non bloquant a peekmessage(),
    sinon tu te mets en attente de message avec un getmessage(), pas besoin de sleep.

    Pour la mise a jour de ton booleen, ca se fait dans la procedure de gestion des messages, en gros ton application est inaccessible: pendant le redimensionnement, pendant le basculement fenetre/plein ecran, pendant l'affichage d'un menu, etc..

    Je te conseille, si tu ne sais pas trop comment t'en sortir, d'utiliser le Wizard du SDK 8.1, ca te cree une application Direct3D complete, avec tout le code pour gerer les evenements windows. Libre a toi evidemment de rajouter du code pour gerer tes propres objets !

    Pour ce qui est de la gestion des pertes de devices (ca arrive tout le temps), il n'y a pas tant d'objets que ca dans l'interface Direct3D:
    les vertex/index buffers, les textures, les state blocks etc..
    En gros les vertex/index buffers et les textures qui sont dans le pool 'managed', n'ont pas a etre gerees sauf lors de la destruction du device (changement de resolution ecran par ex). Ceux du pool par défaut doivent etre detruites et recrees dans les procedures Invalidate et Restore de tes objets, de meme pour les state blocks. Tout objet qui a la responsabilité de ressources Direct X doit implanter ces methodes InitDeviceObjects, InvalidateDeviceObjects, RestoreDeviceObjects et DeleteDeviceObjects, qui seront appelées depuis l'application principale.

    Regarde les exemples du SDK ils sont tres complets de ce point de vue la.

    A+
    LeGreg

    Mon site web | Mon blog | Mes photos | Groupe USA
    > BONJOUR, JE SUIS NOUVEAU SUR CE FORUM
    > presse la touche caps lock, stp
    > OH.. MERCI C EST BEAUCOUP PLUS FACILE COMME CA

  10. #10
    Membre régulier
    Profil pro
    Ingénieur R&D
    Inscrit en
    Juillet 2002
    Messages
    81
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 81
    Points : 74
    Points
    74
    Par défaut
    Heu, j'ai pas tout compris...

    Mais, si on ne mets pas le sleep, la charge du processeur est à 100%, c'est pour ça que je veux le sleep.

    Et comment je fais pour restaurer mes textures D3D ? (et autres si il y a besoin...)

  11. #11
    Membre expérimenté

    Profil pro
    Programmeur
    Inscrit en
    Août 2002
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Programmeur

    Informations forums :
    Inscription : Août 2002
    Messages : 1 091
    Points : 1 679
    Points
    1 679
    Par défaut
    c'est ce que j'explique dans mon message ci dessus..

    Tu as deux methodes pour lire les messages de la file de messages:
    l'une peekmessage() est non blocante et permet de passer au rendu lorsque tu as epuisé les messages windows
    l'autre getmessage() est blocante et se met en attente de nouveaux messages (en attendant ton appli ne fait rien).

    Quand ton application est active pas de problemes tu fais un peekmessage et s'il n'y a rien, tu rends ton environnement 3D. Ta consommation CPU est proche de 100% mais ce n'est pas un probleme, surtout si tu codes un jeu, 100% de CPU ce n'est pas de trop et ce n'est pas toujours ateignable (notamment pendant le present(), ton CPU risque d'attendre le tracé de la carte graphique).
    Si tu as peur de consommer trop de CPU tu peux mettre un sleep, mais l'interet est plutot limité dans un jeu.

    Quand ton application est inactive (apres une reduction de la fenetre), si ton appli n'a rien a faire, tu fais un getmessage() qui met ton application en attente d'un message. A la reception du message tu le traites.. Si ce n'est pas un message qui rend ton application active, ben tu continues comme ca jusqu'a recevoir un nouveau message etc... Comme ca ton appli ne consomme rien comme CPU et continue de traiter tous les messages dès qu'ils arrivent.

    Pour le code, comme je te disais, va regarder celui du DirectX application wizard dans le SDK 8.1, tu ne pourras pas trouver de meilleur code.

    LeGreg

    Mon site web | Mon blog | Mes photos | Groupe USA
    > BONJOUR, JE SUIS NOUVEAU SUR CE FORUM
    > presse la touche caps lock, stp
    > OH.. MERCI C EST BEAUCOUP PLUS FACILE COMME CA

  12. #12
    Membre expérimenté

    Profil pro
    Programmeur
    Inscrit en
    Août 2002
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Programmeur

    Informations forums :
    Inscription : Août 2002
    Messages : 1 091
    Points : 1 679
    Points
    1 679
    Par défaut
    Citation Envoyé par Dave
    Et comment je fais pour restaurer mes textures D3D ? (et autres si il y a besoin...)
    Lors du redimensionnement par ex, les textures en memoires video sont invalides (celles du pool DEFAULT), tu dois donc d'abord les detruire a la perte du device (par un release()), puis dès que ton device est a nouveau valide, tu les recrees par la meme methode que tu as utilisé pour les creer en premier lieu

    LeGreg

    Mon site web | Mon blog | Mes photos | Groupe USA
    > BONJOUR, JE SUIS NOUVEAU SUR CE FORUM
    > presse la touche caps lock, stp
    > OH.. MERCI C EST BEAUCOUP PLUS FACILE COMME CA

  13. #13
    Membre régulier
    Profil pro
    Ingénieur R&D
    Inscrit en
    Juillet 2002
    Messages
    81
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 81
    Points : 74
    Points
    74
    Par défaut
    Mais, ce qui m'intéresse en premier, c'est comment détecter si l'utilisateu vient de ALT-TABer...

  14. #14
    Membre expérimenté

    Profil pro
    Programmeur
    Inscrit en
    Août 2002
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Programmeur

    Informations forums :
    Inscription : Août 2002
    Messages : 1 091
    Points : 1 679
    Points
    1 679
    Par défaut
    m'enfin est-ce que tu as ete regarder les exemples?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    case WM_ACTIVATEAPP:
      m_bHasFocus = (BOOL) wParam;
      break;
    LeGreg

    Mon site web | Mon blog | Mes photos | Groupe USA
    > BONJOUR, JE SUIS NOUVEAU SUR CE FORUM
    > presse la touche caps lock, stp
    > OH.. MERCI C EST BEAUCOUP PLUS FACILE COMME CA

  15. #15
    Membre régulier
    Profil pro
    Ingénieur R&D
    Inscrit en
    Juillet 2002
    Messages
    81
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2002
    Messages : 81
    Points : 74
    Points
    74
    Par défaut
    Ouais bon, j'suis un peu dans les vappes ces temps-ci (je sors de l'hopital)...

  16. #16
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : Etats-Unis

    Informations forums :
    Inscription : Juin 2002
    Messages : 256
    Points : 121
    Points
    121
    Par défaut
    Salut!

    Au risque de me faire jetter parce que j'arrive aprés la bataille et que la réponse a donc probablement été donnée, pour economiser le processeur lorsque tu n'as pas le focus :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    if ( IsIconic(hWnd) ) sleep(50)
    IsIconic detecte si la fenetre ayant le handle hWnd a le focus. Si elle ne l'a pas (elle est donc "iconic"), il fait dodo.

    Et pas besoin de t'embeter a gere WM_ACTIVATEAPPavec ca.


    cordialement

    ps : sortez pas les fouets
    OS : WinXP
    Outils : VC++ 8 (Visual Studio 2005)

Discussions similaires

  1. Désactiver le Alt + Tab
    Par kurul1 dans le forum C++Builder
    Réponses: 7
    Dernier message: 14/03/2006, 14h03
  2. [MFC] Comment detecter le phenomene Alt-Tab
    Par kacedda dans le forum MFC
    Réponses: 5
    Dernier message: 09/03/2006, 09h28
  3. Comment désactiver Alt-Tab
    Par psau dans le forum C++Builder
    Réponses: 7
    Dernier message: 13/06/2005, 12h56
  4. Gestion du Alt+Tab
    Par Freakazoid dans le forum DirectX
    Réponses: 16
    Dernier message: 18/08/2004, 12h02
  5. Touche Win et ALT +TAB
    Par Georgey dans le forum Windows
    Réponses: 3
    Dernier message: 18/04/2004, 14h54

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