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

Windows Forms Discussion :

[C#] - Problème avec GetMonitorInfo


Sujet :

Windows Forms

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur
    Avatar de Erakis
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2003
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 523
    Par défaut [C#] - Problème avec GetMonitorInfo
    Bonjour,

    Je tente de déterminer les information lié a un moniteur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
    internal class Win
    {
    ...
     
    [DllImport("user32.dll", EntryPoint = "MonitorFromPoint") ]
    public static extern IntPtr MonitorFromPoint(POINT pt, uint dwFlags);
     
    [DllImport("user32.dll", EntryPoint = "GetMonitorInfo", SetLastError=true) ]
    public static extern bool GetMonitorInfo( IntPtr hMonitor, ref MonitorInfo lpmi );
     
    public const uint MONITOR_DEFAULTTONULL     = 0x00000000;
     
    [StructLayout(LayoutKind.Sequential)]
    	public struct RECT
    {
    	public long left;
    	public long top;
    	public long right;
    	public long bottom;
    }
     
    [StructLayout(LayoutKind.Sequential)]
    	public struct MonitorInfo
    {
    	public UInt32 cbSize;
    	public RECT rcMonitor;
    	public RECT rcWork;
    	public UInt32 dwFlags;
    }
    ....
    }
    Et dans ma fenêtre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    bool result;
    int errorCode;
    IntPtr hPtr = Win.MonitorFromWindow( this.Handle, Win.MONITOR_DEFAULTTONULL );
    if ( hPtr != IntPtr.Zero )
       result = Win.GetMonitorInfo( hPtr, ref mi );
    errorCode = Marshal.GetLastWin32Error();
    J'obtiens toujours le code 87, ce qui sigifie : The parameter is incorrect.

    Quelqu'un pourrait m'éclairer sur ce qui ne fonctionne pas ?
    Merci

  2. #2
    Membre Expert
    Avatar de freddyboy
    Homme Profil pro
    Architecte technique
    Inscrit en
    Novembre 2003
    Messages
    810
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Novembre 2003
    Messages : 810
    Par défaut
    je me trompe peut etre mais ce n'est pas plus facile de passer par les WMI pour recuperer les infos que tu as besoin ?

    @+

  3. #3
    Expert confirmé
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 65
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Par défaut
    perso j'irai dans le même sens que Freddyboy, mais sinon je croyais que la signature de GetMonitorInfo était:
    [DllImport("user32.dll")]
    static extern bool GetMonitorInfo(IntPtr hMonitor,
    out MONITORINFO lpmi);
    tu as mis 'ref' pourquoi :

  4. #4
    Rédacteur
    Avatar de Erakis
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2003
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 523
    Par défaut
    Bonjour,

    Humm... j'ai jeté un coup d'oeil rapidement mais je n'ai rien trouvé.

    Merci quand même.

  5. #5
    Rédacteur
    Avatar de Erakis
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2003
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 523
    Par défaut
    Citation Envoyé par neguib
    perso j'irai dans le même sens que Freddyboy, mais sinon je croyais que la signature de GetMonitorInfo était:
    [DllImport("user32.dll")]
    static extern bool GetMonitorInfo(IntPtr hMonitor,
    out MONITORINFO lpmi);
    tu as mis 'ref' pourquoi :
    Bonjour,

    J'ai essayé avec [In,Out], avec [Out] et avec ref et out, rien ne fonctionne. Même que j'ai quelque fois une EXCEPTION me disant que j'utilise un objet non référencé...

    Merci.

  6. #6
    Membre Expert
    Avatar de freddyboy
    Homme Profil pro
    Architecte technique
    Inscrit en
    Novembre 2003
    Messages
    810
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Novembre 2003
    Messages : 810
    Par défaut
    la signature est bien celle ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    [DllImport("user32.dll", EntryPoint="GetMonitorInfoA")]
    static extern int GetMonitorInfo ( 
    	 int hMonitor,
    	 ref MONITORINFO lpmi);
    tu cherche a faire quoi exactement avec cette methode ?

    @+

  7. #7
    Rédacteur
    Avatar de Erakis
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2003
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 523
    Par défaut
    Citation Envoyé par freddyboy
    la signature est bien celle ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    [DllImport("user32.dll", EntryPoint="GetMonitorInfoA")]
    static extern int GetMonitorInfo ( 
    	 int hMonitor,
    	 ref MONITORINFO lpmi);
    tu cherche a faire quoi exactement avec cette methode ?

    @+
    Récupérer le Handle, WorkAread et les coordonnées de l'écran virtuelle des moniteurs présents.

    La class System.Window.Forms.Screen ne possède pas le Handle ni les coords de l'écran virtuelle.

    De plus, de ce que j'ai lu du WMI, l'information est en lecture seulement, or mon besion est de permettre le changement de résolution (ChangeDisplaySettings), énumérer les devices (EnumDisplayDevices), changer le moniteur primaire, etc...

    Merci encore.
    Si quelqu'un d'autre à la solution à mon problème 187 ?

  8. #8
    Membre Expert
    Avatar de freddyboy
    Homme Profil pro
    Architecte technique
    Inscrit en
    Novembre 2003
    Messages
    810
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Novembre 2003
    Messages : 810
    Par défaut
    et en utilisant ces API:
    System.Windows.Forms.Screen.Bounds
    System.Windows.Forms.Screen.Primary
    System.Windows.Forms.Screen.WorkingArea
    j'ai trouvé ceci sur la page suivante :
    http://msdn.microsoft.com/netframewo...l/win32map.asp

    Cette page fait le lien entre les API Win 32 et les API .NET.

    @+

  9. #9
    Membre Expert
    Avatar de freddyboy
    Homme Profil pro
    Architecte technique
    Inscrit en
    Novembre 2003
    Messages
    810
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Novembre 2003
    Messages : 810
    Par défaut
    Citation Envoyé par Erakis
    La class System.Window.Forms.Screen ne possède pas le Handle ni les coords de l'écran virtuelle.
    bon d'apres ce que tu dis la , cela va pas t'aider semble t il.

    De plus, de ce que j'ai lu du WMI, l'information est en lecture seulement, or mon besion est de permettre le changement de résolution (ChangeDisplaySettings), énumérer les devices (EnumDisplayDevices), changer le moniteur primaire, etc...
    ca c'est normal, WMI ne fait qu'interroger une base de données. Par contre si tu arrive a recuperer les infos via WMI tu as me semble t il des methodes pour changer la resolution. Enfin je crois ...

    @+

  10. #10
    Rédacteur
    Avatar de Erakis
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2003
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 523
    Par défaut
    Merci freddyboy

    Voilà ce que j'avais trouvé avec le WMI. De l'information il n'en manque pas Mais tout est en lecture seul
    http://msdn.microsoft.com/library/de...resolution.asp

    Citation Envoyé par freddyboy
    et en utilisant ces API:
    System.Windows.Forms.Screen.Bounds
    System.Windows.Forms.Screen.Primary
    System.Windows.Forms.Screen.WorkingArea
    j'ai trouvé ceci sur la page suivante :
    http://msdn.microsoft.com/netframewo...l/win32map.asp

    Cette page fait le lien entre les API Win 32 et les API .NET.

    @+
    Mais il me manque encore les coordonnée de l'écran virtuelle
    Merci beaucoup

    PS : Avez-vous essayé le code voir si vous reçevez la même erreur que moi ?

  11. #11
    Rédacteur
    Avatar de Erakis
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2003
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 523
    Par défaut
    J'ai trouvé autre chose de très intéressant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SystemInformation.VirtualScreen
    Merci à tous.

  12. #12
    Expert confirmé
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 65
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Par défaut
    voici un exemple pour le changement dynamique de resolution
    http://www.codeproject.com/csharp/CSDynamicScrRes.asp

  13. #13
    Rédacteur
    Avatar de Erakis
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2003
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 523
    Par défaut
    Citation Envoyé par neguib
    voici un exemple pour le changement dynamique de resolution
    http://www.codeproject.com/csharp/CSDynamicScrRes.asp
    Bonjour,

    Pour le changement de résolution et le reste je maîtrisais déjà le tout. C'était seulement le problème 87 de l'appel à GetMonitorInfo. Bien que j'aurais bien aimé comprendre pourquoi cela ne fonctione pas

    Merci quand même.

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

Discussions similaires

  1. VC++ Direct3D8, problème avec LPD3DXFONT et LPD3DTEXTURE8
    Par Magus (Dave) dans le forum DirectX
    Réponses: 3
    Dernier message: 03/08/2002, 11h10
  2. Problème avec [b]struct[/b]
    Par Bouziane Abderraouf dans le forum CORBA
    Réponses: 2
    Dernier message: 17/07/2002, 10h25
  3. Problème avec le type 'Corba::Any_out'
    Par Steven dans le forum CORBA
    Réponses: 2
    Dernier message: 14/07/2002, 18h48
  4. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

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