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

MFC Discussion :

Problème résolution d'écran


Sujet :

MFC

  1. #1
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    165
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 165
    Par défaut Problème résolution d'écran
    Bonjour à tous,

    J'ai développé une application en VC++ 6.0 qui ne doit pas fonctionner sur des écrans de moins de 800x600.
    Je teste donc la résolution d'écran au démarrage de j'affiche un avertissement lorsque la résolution n'est pas adéquate.
    Je voudrais ensuite appeler la fenêtre Windows [Propriétés de Affichage] afin que la résolution puisse être changée pour que l'exécution puisse continuer en cas de succès.

    Problème comment procéder ?
    Merci d'avance de tout aide.

  2. #2
    Membre chevronné Avatar de stephdim
    Profil pro
    Inscrit en
    Août 2007
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 462
    Par défaut
    salut,

    ben pour avoir la boite de dialogue classique "Propriétés de l'affichage", il faut démarrer : C:\Windows\System32\desk.cpl via un ShellExecute() par ex.

    mais tu peux changer la résolution de l'écran par programme aussi via la fonction GDI "ChangeDisplaySettings()" . Ne pas oublier de rétablir la bonne résolution en sortant de l'appli.

    @+

  3. #3
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    165
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 165
    Par défaut
    Salut stephdim,

    desk.cpl n'est pas un fichier executable
    et lorsque je lance ShellExecuteEx, j'ai l'erreur suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Aucun programme n est associé à ce fichier pour exécuter cette
    action. Créez une association en utilisant l application 
    Options des dossiers dans le Panneau de configuration
    L'option de ChangeDisplaySettings() je vais tester après.

  4. #4
    Membre chevronné Avatar de stephdim
    Profil pro
    Inscrit en
    Août 2007
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 462
    Par défaut
    desk.cpl est bien un executable "maquillé", c'est une applet de configuration,
    et normalement ShellExecute() devrait rechercher la bonne association correspondant à l'extension .cpl

    en jettant un coup d'oeil dans la base de registre, un fichier .cpl s'ouvre comme ça :

    rundll32.exe shell32.dll,Control_RunDLL "%1",%*

    ou %1 est le chemin pour 'Desk.cpl' et %* d'autres éventuels paramètres.

    maintenant, je me repète, mais ShellExecute doit savoir faire le nécessaire pour ouvrir ce type de fichier. As tu bien précisé le verbe 'Open' ?

    @+

  5. #5
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    165
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 165
    Par défaut
    J'ai même essayé avec le verbe "properties", mais rien
    est ce ça marche chez toi ?

  6. #6
    Membre chevronné Avatar de stephdim
    Profil pro
    Inscrit en
    Août 2007
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 462
    Par défaut
    je viens de faire l'essai à l'instant, ce code marche très bien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ShellExecute(NULL,NULL,_T("c:\\windows\\system32\\desk.cpl"),NULL,NULL,SW_SHOWNORMAL);
    j'ai bien l'applet qui s'ouvre.

    apparemment tu n'as pas les associations de définies sur ton systeme d'exploitation ce qui est qd meme bizarre.

    sinon autre méthode, récupérer l'adresse de la fonction Control_RunDLL() dans shell32.dll via un GetProcAddress() et donner en paramètre le chemin de l'applet

    mais cette fonction n'est pas documentée, ni dispo dans la SDK alors pour le prototypage il faut deviner

    je dirais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    void Control_RunDLL(LPCWSTR pFileName);
    @+

  7. #7
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    165
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 165
    Par défaut
    Effectivement avec un verbe null ça marche très bien.
    est ce qu'il est possible que cet appel soit bloquant ?

  8. #8
    Membre chevronné Avatar de stephdim
    Profil pro
    Inscrit en
    Août 2007
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 462
    Par défaut
    sinon essaye ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ShellExecute(NULL,NULL,_T("rundll32.exe shell32.dll,Control_RunDLL \"c:\\windows\\system32\\desk.cpl\""),NULL,NULL,SW_SHOWNORMAL);
    là ça devrait le faire

    mais comme rien n'est documenté, c'est pas dit que c'est compatible entre les différentes versions de Windows

    en tout cas pour XP c'est ok, mais pour Vista ???

    @+

  9. #9
    Membre chevronné Avatar de stephdim
    Profil pro
    Inscrit en
    Août 2007
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 462
    Par défaut
    est ce qu'il est possible que cet appel soit bloquant ?
    Là il faut que tu passes par ShellExecuteEx() et que tu récupères le handle du process (membre hProcess)

    ensuite, juste faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    WaitForSingleObject(hProcess,INFINITE);
    lorsque le process est "killé" (en fermant la boite de dialogue par ex), ton programme reprendra la main.

    @+

  10. #10
    Membre confirmé
    Inscrit en
    Janvier 2006
    Messages
    165
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 165
    Par défaut
    C'est ça, et c'est bien pour cela que j'ai choisi ShellExecuteEx au lieu de ShellExecute, mais je n'étais pas allé jusqu'au bout.
    Merci pour ton aide et à plus.

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

Discussions similaires

  1. Résolution d'écran problème
    Par charret2002 dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 29/11/2006, 13h03
  2. Problème lors du changement de résolution d'écran
    Par yangoal25 dans le forum VB 6 et antérieur
    Réponses: 10
    Dernier message: 10/11/2006, 15h33
  3. Réponses: 1
    Dernier message: 11/05/2006, 15h17
  4. [C#]problème de résolution d'écran
    Par erazorhead dans le forum Windows Forms
    Réponses: 8
    Dernier message: 07/04/2006, 13h51

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