Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

MODIFIER CORRECTEMENT LA RESOLUTION DE L'ECRAN


Information sur la source

Catégorie :API Niveau : Initié Date de création : 11/06/2003 Date de mise à jour : 20/12/2003 19:14:27 Vu / téléchargé: 3 387 / 650

Note :
9,67 / 10 - par 6 personnes
9,67 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (32)
Ajouter un commentaire et/ou une note

Description

J'ai trouvé plusieurs sources pour modifier la résolution d'écran sur ce site, mais à chaque fois, la barre des taches n'était pas déplacée. Si on augmentait la résolution, on se retrouvait avec une barre des taches vers le milieu de l'écran, et en la réduisant, on avait une barre des taches en dehors de l'écran. Cette source corrige ce problème.

MISE A JOUR :
- La fonction SetRes est plus "intelligente" : lorsqu'un paramètre passé est identique à la valeur courante, cette dernière n'est plus modifiée.
- Les fonctions GetResX et GetResY font maintenant directement appel aux API (plus de Screen.). Avec l'ancienne méthode, lorqu'on testait la résolution juste après l'avoir modifiée, on avait les anciennes valeurs.  
 

Source

  • Option Explicit
  • Private Declare Function EnumDisplaySettings Lib "user32" Alias "EnumDisplaySettingsA" (ByVal lpszDeviceName As Long, ByVal iModeNum As Long, lpDevMode As Any) As Boolean
  • Private Declare Function ChangeDisplaySettings Lib "user32" Alias "ChangeDisplaySettingsA" (lpDevMode As Any, ByVal dwflags As Long) As Long
  • Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
  • Private Type DEVMODE
  • dmDeviceName As String * 32
  • dmSpecVersion As Integer
  • dmDriverVersion As Integer
  • dmSize As Integer
  • dmDriverExtra As Integer
  • dmFields As Long
  • dmOrientation As Integer
  • dmPaperSize As Integer
  • dmPaperLength As Integer
  • dmPaperWidth As Integer
  • dmScale As Integer
  • dmCopies As Integer
  • dmDefaultSource As Integer
  • dmPrintQuality As Integer
  • dmColor As Integer
  • dmDuplex As Integer
  • dmYResolution As Integer
  • dmTTOption As Integer
  • dmCollate As Integer
  • dmFormName As String * 32
  • dmUnusedPadding As Integer
  • dmBitsPerPel As Integer
  • dmPelsWidth As Long
  • dmPelsHeight As Long
  • dmDisplayFlags As Long
  • dmDisplayFrequency As Long
  • End Type
  • Public Enum EnumSetRes
  • SUCCES = 0
  • ECHEC = -2
  • End Enum
  • Public Function GetNbCoul() As Integer
  • Dim dmEcran As DEVMODE
  • Dim blTMP As Boolean
  • blTMP = EnumDisplaySettings(0, -1, dmEcran)
  • GetNbCoul = dmEcran.dmBitsPerPel
  • End Function
  • Public Function GetResX() As Integer
  • Dim dmEcran As DEVMODE
  • EnumDisplaySettings 0, -1, dmEcran
  • GetResX = dmEcran.dmPelsWidth
  • ' GetResX = Screen.Width \ Screen.TwipsPerPixelX
  • End Function
  • Public Function GetResY() As Integer
  • Dim dmEcran As DEVMODE
  • EnumDisplaySettings 0, -1, dmEcran
  • GetResY = dmEcran.dmPelsHeight
  • ' GetResY = Screen.Height \ Screen.TwipsPerPixelY
  • End Function
  • Public Function SetRes(ByVal RezX As Single, ByVal RezY As Single, ByVal NbCoul As Integer) As EnumSetRes
  • If RezX = GetResX And RezY = GetResY And NbCoul = GetNbCoul Then Exit Function
  • Dim dmEcran As DEVMODE
  • Dim blTMP As Boolean, lgTMP As Long
  • blTMP = EnumDisplaySettings(0, -1, dmEcran)
  • 'dmEcran.dmFields = 1835008
  • If RezX <> GetResX Then dmEcran.dmFields = &H80000
  • If RezY <> GetResY Then dmEcran.dmFields = dmEcran.dmFields Or &H100000
  • If NbCoul <> GetNbCoul Then dmEcran.dmFields = dmEcran.dmFields Or &H100000
  • dmEcran.dmPelsWidth = RezX
  • dmEcran.dmPelsHeight = RezY
  • dmEcran.dmBitsPerPel = NbCoul
  • Call ChangeDisplaySettings(dmEcran, 1)
  • blTMP = SendMessage(65535, 27, 0, 0)
  • Dim ScInfo As Long
  • ScInfo = RezY * 2 ^ 16 + RezX
  • SendMessage &HFFFF&, &H7E, ByVal NbCoul, ByVal ScInfo
  • SetRes = lgTMP
  • End Function
Option Explicit

Private Declare Function EnumDisplaySettings Lib "user32" Alias "EnumDisplaySettingsA" (ByVal lpszDeviceName As Long, ByVal iModeNum As Long, lpDevMode As Any) As Boolean
Private Declare Function ChangeDisplaySettings Lib "user32" Alias "ChangeDisplaySettingsA" (lpDevMode As Any, ByVal dwflags As Long) As Long
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Type DEVMODE
   dmDeviceName As String * 32
   dmSpecVersion As Integer
   dmDriverVersion As Integer
   dmSize As Integer
   dmDriverExtra As Integer
   dmFields As Long
   dmOrientation As Integer
   dmPaperSize As Integer
   dmPaperLength As Integer
   dmPaperWidth As Integer
   dmScale As Integer
   dmCopies As Integer
   dmDefaultSource As Integer
   dmPrintQuality As Integer
   dmColor As Integer
   dmDuplex As Integer
   dmYResolution As Integer
   dmTTOption As Integer
   dmCollate As Integer
   dmFormName As String * 32
   dmUnusedPadding As Integer
   dmBitsPerPel As Integer
   dmPelsWidth As Long
   dmPelsHeight As Long
   dmDisplayFlags As Long
   dmDisplayFrequency As Long
End Type
Public Enum EnumSetRes
   SUCCES = 0
   ECHEC = -2
End Enum

Public Function GetNbCoul() As Integer
   Dim dmEcran As DEVMODE
   Dim blTMP As Boolean
   blTMP = EnumDisplaySettings(0, -1, dmEcran)
   GetNbCoul = dmEcran.dmBitsPerPel
End Function
Public Function GetResX() As Integer
   Dim dmEcran As DEVMODE
   EnumDisplaySettings 0, -1, dmEcran
   GetResX = dmEcran.dmPelsWidth
'   GetResX = Screen.Width \ Screen.TwipsPerPixelX
End Function
Public Function GetResY() As Integer
   Dim dmEcran As DEVMODE
   EnumDisplaySettings 0, -1, dmEcran
   GetResY = dmEcran.dmPelsHeight
'   GetResY = Screen.Height \ Screen.TwipsPerPixelY
End Function
Public Function SetRes(ByVal RezX As Single, ByVal RezY As Single, ByVal NbCoul As Integer) As EnumSetRes
    If RezX = GetResX And RezY = GetResY And NbCoul = GetNbCoul Then Exit Function
    Dim dmEcran As DEVMODE
    Dim blTMP As Boolean, lgTMP As Long
    blTMP = EnumDisplaySettings(0, -1, dmEcran)
    'dmEcran.dmFields = 1835008
    If RezX <> GetResX Then dmEcran.dmFields = &H80000
    If RezY <> GetResY Then dmEcran.dmFields = dmEcran.dmFields Or &H100000
    If NbCoul <> GetNbCoul Then dmEcran.dmFields = dmEcran.dmFields Or &H100000
    dmEcran.dmPelsWidth = RezX
    dmEcran.dmPelsHeight = RezY
    dmEcran.dmBitsPerPel = NbCoul
    Call ChangeDisplaySettings(dmEcran, 1)
    blTMP = SendMessage(65535, 27, 0, 0)
    Dim ScInfo As Long
    ScInfo = RezY * 2 ^ 16 + RezX
    SendMessage &HFFFF&, &H7E, ByVal NbCoul, ByVal ScInfo
    SetRes = lgTMP
End Function  

Conclusion

Le fichier ZIP contient un projet de test très simple.

Je vous recommande de tester ce code dans un programm compilé, car l'environnement de développement de VB peut (parfois) planter lors du changement de résolution (c'est également la cas si vous la changez avec le Panneau de Configuration).

Ce code a été testé et fonctionne sous :
- Win95
- Win98SE
- WinXP
- WinME
- WinNT4 (SP6)
- Win2k

Si vous testez ce code sous une autre version de Windows, merci de laisser un commentaire afin d'indiquer si ce code fonctionne ou non.  
 

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Commentaires et avis

signaler à un administrateur
Commentaire de Jujufouq le 11/06/2003 10:10:41

Punaise, je suis impressionné. Vraiment une très bonne source qui marche impec!

FONCTIONNE SOUS XP!!!

signaler à un administrateur
Commentaire de YS1 le 11/06/2003 12:10:05

Je vous remercie de votre commentaire. La compatibilité avec XP était mon principal souci.

signaler à un administrateur
Commentaire de PROGRAMMIX le 11/06/2003 12:13:02

Pourrais-tu ajouter ce qu'il faut pour jongler entre les "petites" et "grandes" polices ?  Car au boulot, j'ai des collègues qui sont en grandes polices ; ce qui "dénature" certaines de mes applications réalisées avec des petites polices...

signaler à un administrateur
Commentaire de DedeSurf le 11/06/2003 14:57:35

PROGRAMMIX &gt; arret le dev 30 sec et farfouille dans le systèm de windows tu trouvera s k tu cherche ...
il y a un prog (d win) qui t demand la taille des caractère(ptit ou gros), j n sè plus ou ! dsl
Lea

signaler à un administrateur
Commentaire de PROGRAMMIX le 11/06/2003 16:37:36

-&gt;DedeSurf &gt;&gt; OK, je sais modifier la résolution des polices manuellement.  Mais j'aimerais trouver le truc pour que mes applications passent automatiquement dans l'un ou l'autre mode indépendamment des résolutions que l'utilisateur a définies.

signaler à un administrateur
Commentaire de YS1 le 11/06/2003 17:43:55

PROGRAMMIX &gt; Je ne sais pas où est enregistrée cette information ni comment la modifier. C'est sans doute dans la base de registre, dans une sous-clé de HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion.

Mais je ne pense pas que la modification automatique de cette option ait un intérêt, car Windows demande un redémarrage pour appliquer le changement.

signaler à un administrateur
Commentaire de jcdhl le 12/06/2003 08:19:42

Super source
Ca marche Nickel
Fonctionne sur windows NT4 service pack 6 !!!

signaler à un administrateur
Commentaire de ThunderPsycho le 12/06/2003 12:55:59

Superbe

signaler à un administrateur
Commentaire de YS1 le 12/06/2003 14:56:37

Vous trouverez une application de ce code dans un autre article que j'ai déposé :

http://www.vbfrance.com/article.aspx?Val=9229

signaler à un administrateur
Commentaire de dtom le 06/09/2003 12:10:35

Merci pour ce code ;-)

signaler à un administrateur
Commentaire de JeanPhi2306 le 19/12/2003 20:17:13

Tres tres bonne source pour moi ! merci encore (utiliser sous Win2000 )

signaler à un administrateur
Commentaire de cauroir le 10/05/2004 21:15:59

Ca marche tres bien (sous XP)
bravo  10/10
Qui a essaye sous W98 ?

signaler à un administrateur
Commentaire de YS1 le 11/05/2004 18:47:16

J'ai transmis ce code à une de mes connaissances disposant de Win98SE avant de publier le code.

signaler à un administrateur
Commentaire de coyoterunstar le 14/05/2004 01:02:55

Génial !!
J'étais embeté avec ce probleme depuis des lustres !
Bravissimo ...

signaler à un administrateur
Commentaire de EvilGost le 20/12/2004 12:46:30

bravo, je l'ai testé sur 98, ca marche impeccable, 10/10 ;)

signaler à un administrateur
Commentaire de bricomaniac le 08/10/2006 16:45:53

comment mettre cette fonction dans une page html ????
je debute alors si j'ai dit une connerie nevous moquez pas !

signaler à un administrateur
Commentaire de brand1991 le 12/05/2008 19:48:36

jcomprends rien, comment on introduit ca dans VB 2008 ? DEVMODE est souligné et tt... Pfff

signaler à un administrateur
Commentaire de YS1 le 12/05/2008 20:35:12

Ce code a été écrit sous VB6. Je ne sais pas du tout quelles sont les différences avec VB2008.

signaler à un administrateur
Commentaire de brand1991 le 12/05/2008 21:23:04

ah oké... Mais VB6 on le trouve ou alors? car je rame bien en ce moment mdr

signaler à un administrateur
Commentaire de YS1 le 12/05/2008 21:50:44

C'est une version périmée. Je ne vous recommande pas de l'utiliser. (D'ailleurs, entre nous, je vous suggère, si vous n'avez pas déjà fait l'acquisistion d'un logiciel couteux, de vous orienter vers des langages pour lesquels on trouve des environnements de développement gratuits, comme Delphi ou C++)

signaler à un administrateur
Commentaire de brand1991 le 12/05/2008 21:53:26

j'ai prit gout malheuresement a VB 2008 lol, mais est ce que C++ est plus facile? Que peut on faire avec? je suis largué...

signaler à un administrateur
Commentaire de YS1 le 12/05/2008 22:01:05

Je ne connais pas VB2008, donc je ne peux pas faire de comparaison. Mais si ça ressemble à VB6 (ce qui n'est pas sûr, mais pas totalement exclu non plus), je dirais que C++ est plus difficile à appréhender, mais aussi plus rapide, et surtout plus rigoureux. Un risque, quand on commence à programmer en Basic ou une de ses variantes (mais peut-être VB2008 fait-il miraculeusement exception) est de prendre de mauvaises habitudes, car il s'agit d'un langage très permissif. Delphi en revanche a pour moi l'avantage d'être à peu près aussi abordable que VB (que VB6, en tout cas), mais plus rigoureux (et plus rapide aussi). Passer de VB6 à Delphi m'a permis de corriger certaines (mauvaises) habitudes que j'avais prises en VB.

signaler à un administrateur
Commentaire de brand1991 le 12/05/2008 22:05:45

Ah c'est bon à savoir en tout cas, VB 2008 je pense que c'est la suite de vb6 mais il y a des termes différents, et pour trouver un tuto exclusif à vb 2008, bah faut s'accrocher...
Sous Delphi, c'est comme vb ? C'est a dire une fenetre visuelle (bouton..) et une fenetre code ?
Dsl de toutes ses questions lol ^^

signaler à un administrateur
Commentaire de Arnotic le 12/05/2008 22:05:58 administrateur CS

Je confirme que VB6 est à mettre dans une vitrine au musée.

Pour la suite tu peux trés bien développer gratuitement en .NET (la plateforme est gratuite) et de plus tu as les versions Express de VS gratuites aussi.

Après en C tu peux tout faire (ou presque l'ASM restera à jamais irremplaçable pour certaine chose).

signaler à un administrateur
Commentaire de Arnotic le 12/05/2008 22:07:18 administrateur CS

VB2008 = .NET pour information.
VB .NET.

signaler à un administrateur
Commentaire de brand1991 le 12/05/2008 22:08:34

ah bon? je savais pas :D, merci de l'info, donc si je regarde des tuto pour VB.net, c'est pour le 2008 ?

signaler à un administrateur
Commentaire de Arnotic le 12/05/2008 22:13:23 administrateur CS

oui :-)

signaler à un administrateur
Commentaire de brand1991 le 12/05/2008 22:14:53

Ah tout de suite je retrouve le sourir lol, étant débutant ^^, j'ai fait quelques petits logiciels sans importance, mais la, je pense que ca va m'aider grandement :D merci ^^

signaler à un administrateur
Commentaire de Arnotic le 12/05/2008 22:19:09 administrateur CS

De rien ! :-)

Mais pense sérieusement au C. Le code natif il y a que ca de vrai ;-)

signaler à un administrateur
Commentaire de brand1991 le 12/05/2008 22:21:35

Lol, okay, bah j'vais m'orienter vers le C alors, puis le C++ est la continuité je crois...? M'enfin en tout cas, deja ca de fait, et en C, que y a t il comme logiciel potable?

signaler à un administrateur
Commentaire de Arnotic le 12/05/2008 22:38:14 administrateur CS

Le C++ n'est pas vraiment la continuité du C... C'est un autre language trés trés proche syntaxtiquement parlant. Mais apporte des notions bien différentes comme les classes (donc la programmation objet, ...).

Le compilateur tu parles je pense ?

Visual Studio Express (gratuit).

Va donc faire un tour sur CppFrance je t'y retrouverai. Tu trouveras aussi un tuto pour mettre en place VS Express.

En C faut se faire un peu mal au début, mais après...

signaler à un administrateur
Commentaire de brand1991 le 12/05/2008 23:20:33

Dac merci du conseil, puis je comptais aussi peut etre acheter un bouquin sur un langage pour vraiment avoir de bonnes bases...

Ajouter un commentaire



Nos sponsors

Sondage...

CalendriCode



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, 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
Temps d'éxécution de la page : 0,265 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.