none
Erreur étendue RRS feed

  • Question

  • Bonjour tout le monde,

    Pour lire le délai de l'économiseur de l'écran j'obtiens 0 dans lSeconds, alors que dans la boîte de dialogue système je vois 10 minutes.

    int SPI_GETSCREENSAVETIMEOUT = 0x000E;

    int lSeconds = 0; int lRet = SystemParametersInfo(SPI_GETSCREENSAVETIMEOUT, 0, lSeconds, 0);

    J'ai trouvé plein d'exemples de GetLastError en C++, en C# j'en ai trouvé un dans un projet où il était question de LDAP.

    private string _messages = "ldapautherrors.xml";

    // variables

    static private string _errorMsg = "";

    static private string _provider = "";

    private const string nodeKey = "message";

    private const string indexAttr = "index";

    static private Hashtable errors = null;

    public static int getExtendedError() { IntPtr errorbuf = (IntPtr)0; IntPtr namebuf = (IntPtr)0; int error = 0; try { errorbuf = Marshal.AllocHGlobal(256 * 2); namebuf = Marshal.AllocHGlobal(256 * 2); ADsGetLastError(ref error, errorbuf, 256, namebuf, 256); _errorMsg = (string)Marshal.PtrToStringUni(errorbuf); _provider = Marshal.PtrToStringUni(namebuf); return error; } finally { if (errorbuf != (IntPtr)0) Marshal.FreeHGlobal(errorbuf); if (namebuf != (IntPtr)0) Marshal.FreeHGlobal(namebuf); } }

    et le souci c'est que j'obtiens 0, comme erreur.

    J'ai l'impression que j'ai dû mélanger des trucs, non ?

    D'ailleurs j'ai ajouté des attributs static au petit bonheur la chance en ajustant jusqu'à ce que le compilateur ne proteste pas ...


    • Modifié Gloops vendredi 18 décembre 2015 04:33
    vendredi 18 décembre 2015 04:19

Réponses

  • Bonjour,

    Votre appel à SystemParametersInfo() vous n'utilisez pas une version qui retourne une valeur, donc votre variable n'est jamais affectée par la méthode.

    Vous devez utiliser une signature de SystemParametersInfo() qui renvoie un entier comme par exemple :

    [DllImport("user32.dll", SetLastError = true)]
    [return: MarshalAs(UnmanagedType.Bool)]
    static extern bool SystemParametersInfo(uint uiAction, uint uiParam, ref int pvParam, uint fWinIni);

    et ensuite

    uint SPI_GETSCREENSAVETIMEOUT = 0x000E;
    
    int lSeconds = 0;
    bool lRet = SystemParametersInfo(SPI_GETSCREENSAVETIMEOUT, 0, ref lSeconds, 0);
    

    Cordialement,


    Yan Grenier

    Merci de bien vouloir "Marquer comme réponse", les réponses qui ont répondues à votre question, et de noter les réponses que vous avez trouvé utiles.


    • Modifié Yan Grenier - MTFC vendredi 18 décembre 2015 16:07
    • Marqué comme réponse Gloops vendredi 18 décembre 2015 20:43
    vendredi 18 décembre 2015 16:06

Toutes les réponses

  • Bonjour, Gloops,

    Pouvez-vous préciser la source de l’exemple publié ? Je vous invite à consulter la documentation de la fonction ADsGetLastError.

    Cordialement,
    Dimitar

    vendredi 18 décembre 2015 15:30
    Modérateur
  • Bonjour,

    Votre appel à SystemParametersInfo() vous n'utilisez pas une version qui retourne une valeur, donc votre variable n'est jamais affectée par la méthode.

    Vous devez utiliser une signature de SystemParametersInfo() qui renvoie un entier comme par exemple :

    [DllImport("user32.dll", SetLastError = true)]
    [return: MarshalAs(UnmanagedType.Bool)]
    static extern bool SystemParametersInfo(uint uiAction, uint uiParam, ref int pvParam, uint fWinIni);

    et ensuite

    uint SPI_GETSCREENSAVETIMEOUT = 0x000E;
    
    int lSeconds = 0;
    bool lRet = SystemParametersInfo(SPI_GETSCREENSAVETIMEOUT, 0, ref lSeconds, 0);
    

    Cordialement,


    Yan Grenier

    Merci de bien vouloir "Marquer comme réponse", les réponses qui ont répondues à votre question, et de noter les réponses que vous avez trouvé utiles.


    • Modifié Yan Grenier - MTFC vendredi 18 décembre 2015 16:07
    • Marqué comme réponse Gloops vendredi 18 décembre 2015 20:43
    vendredi 18 décembre 2015 16:06
  • Bonjour, Gloops,

    Pouvez-vous préciser la source de l’exemple publié ? Je vous invite à consulter la documentation de la fonction ADsGetLastError.

    Cordialement,
    Dimitar

    Bonjour,

    Ah oui j'imagine que j'aurais été bien inspiré de le faire tout de suite, d'autant que sur la recherche de "getLastError", cette page arrivait hier en troisième ou quatrième position, et aujourd'hui je ne la vois pas sur la première page.

    http://www.verycomputer.com/113_1c98d2a6e9c01329_1.htm

    Comme je l'ai dit c'est une adaptation un peu "libre" que j'ai faite, puisque je n'ai pas cherché à justifier les attributs static ajoutés.

    (j'ai bien coché "me prévenir quand quelqu'un répond à ce message" : hier non on dirait)


    • Modifié Gloops vendredi 18 décembre 2015 19:49
    vendredi 18 décembre 2015 19:48
  • Bonjour,

    Votre appel à SystemParametersInfo() vous n'utilisez pas une version qui retourne une valeur, donc votre variable n'est jamais affectée par la méthode.

    Vous devez utiliser une signature de SystemParametersInfo() qui renvoie un entier comme par exemple :

    [DllImport("user32.dll", SetLastError = true)]
    [return: MarshalAs(UnmanagedType.Bool)]
    static extern bool SystemParametersInfo(uint uiAction, uint uiParam, ref int pvParam, uint fWinIni);

    et ensuite

    uint SPI_GETSCREENSAVETIMEOUT = 0x000E;
    
    int lSeconds = 0;
    bool lRet = SystemParametersInfo(SPI_GETSCREENSAVETIMEOUT, 0, ref lSeconds, 0);

    Ah ... Avec des nuits courtes on arrive à faire plein de choses, mais ... ça a un coût.

    L'API Viewer ne le mettait pas en 2004, et aux dernières nouvelles il n'y avait plus personne pour faire de mises à jour dessus, mais en tout cas il n'est pas impossible que je mérite le bonnet d'âne pour ne pas avoir vu qu'il manquait ref.

    Quand aux deux lignes de références au-dessus, je ne suis pas sûr que j'aurais eu les billes pour les corriger.

    D'ailleurs, le compilateur me dit que je ferais bien de chercher une doc plus complète : "Impossible de marshaler 'return value' : Combinaison de types managés/non managés (les types Int32/UInt32 doivent être associés à 14, U4 ou Error).

    Logiquement, une recherche sur managé devrait me rafraichir les idées sur la question, quant à 14, U4 ou Error ... Je sais que uiAction vaut 14 pour lire le délai de l'économiseur d'écran, mais je ne suis même pas sûr que ça soit de ça qu'on parle.

    Merci pour les réponses.

    vendredi 18 décembre 2015 20:11
  • Bon ça y est, ma déclaration de SystemParametersInfo retournait un entier, et ça ne lui a pas trop plu on dirait de recevoir un booléen. Une fois que j'ai mis bool dans la déclaration je reçois bien le délai en secondes.

    Du coup il n'y a pas d'erreur, mais je vais quand même relire la doc de ADsGetLastErrorFunction. D'ailleurs, elle fait partie des exemples en C++ dont je parlais ... Je ferais bien de tâcher de traduire en C# on dirait.

    *

    Ah une considération pratique : quand j'ai développé la première version de ce programme il y a quelque temps (il ne s'occupait pas du délai préexistant), la boîte de dialogue générée par MessageBox.Show (pour laquelle j'ai ajouté System.Windows.Forms dans mon application console) s'affichait devant la fenêtre de console, donc ça marchait très bien. Maintenant, elle s'affiche derrière, il faut penser à déplacer la fenêtre de console par un glissé de souris pour trouver le message afin que le programme se poursuive.

    Y a-t-il une astuce simple, ou faut-il carrément appeler une autre API pour donner le focus au message ?

    Et d'ailleurs c'est facile de dire ça, mais pour le faire ... MessageBox donne une fenêtre modale, donc une instruction placée après ne s'appliquera pas à cette fenêtre message, il faudrait alors un truc tout simple et tout bête du style ouvrir un autre thread avec une boucle dedans pour sélectionner le message, et refermer le thread une fois que c'est fait, sachant que je n'ai jamais programmé en multi-thread.

    Mais le changement d'anti-virus s'est avéré *très* utile. Faut-il plutôt chercher dans cette voie ?

    vendredi 18 décembre 2015 20:35