2009-02-22 4 views
1

Dans une application que j'ai écrite il y a quelques années, j'utilise la fonction SystemParametersInfo avec SPI_GETPOWEROFFTIMEOUT pour obtenir le délai d'attente pour le moniteur. Sur Vista cela ne fonctionne plus.Comment obtenir le délai d'expiration du moniteur sur Vista

J'ai donc décidé de faire ce travail sur Vista, mais après quelques heures, j'ai l'impression de ne plus être proche d'une solution.

La plupart des fonctions que je vais parler sont décrites sur http://msdn.microsoft.com/en-us/library/aa373163(VS.85).aspx

À ma connaissance je devrais: 1. , utilisez la fonction PowerGetActiveScheme, pour obtenir régime actuel 2. Utilisation PowerEnumerate avec GUID_VIDEO_SUBGROUP 3. Utilisation PowerReadACValue (ou valeur DC) pour obtenir la valeur.

Est-ce exact? On dirait que beaucoup de travail pour arriver à un paramètre. Si c'est la bonne façon, il y a une chose que je ne comprends pas. Sur mon système, PowerEnumerate renvoie 3 clés. Comment savoir quel est le délai d'attente du moniteur?

Voici mon code jusqu'à présent. J'ai des problèmes avec PowerReadACValue, je ne l'ai probablement pas défini ou utilisé correctement. J'ai aussi essayé

class Program 
{ 
    [DllImport("powrprof.dll")] 
    static extern UInt32 PowerGetActiveScheme(IntPtr UserRootPowerKey, ref IntPtr ActivePolicyGuid); 

    [DllImport("powrprof.dll")] 
    static extern uint PowerEnumerate(
       IntPtr RootPowerKey, 
       IntPtr SchemeGuid, 
       Guid SubGroupOfPowerSettingGuid, 
       UInt32 AcessFlags, 
       UInt32 Index, 
       ref Guid Buffer, 
       ref UInt32 BufferSize); 

    [DllImport("powrprof.dll")] 
    static extern uint PowerReadACValue(
       IntPtr RootPowerKey, 
       IntPtr SchemeGuid, 
       IntPtr SubGroupOfPowerSettingGuid, 
       Guid PowerSettingGuid, 
       ref IntPtr Type, 
       ref IntPtr Buffer, 
       ref UInt32 BufferSize); 

    static void Main(string[] args) 
    { 
     IntPtr activeGuidPtr = IntPtr.Zero; 
     uint res = PowerGetActiveScheme(IntPtr.Zero, ref activeGuidPtr); 
     if (res == 0) 
     { 
      Guid VideoSettingGuid = new Guid(); 
      UInt32 index = 0; 
      UInt32 BufferSize = (UInt32)Marshal.SizeOf(typeof(Guid)); 
      while (0 == PowerEnumerate(
       IntPtr.Zero, activeGuidPtr, new Guid("7516b95f-f776-4464-8c53-06167f40cc99"), 18, index, ref VideoSettingGuid, ref BufferSize)) 
      { 
       Console.Write(VideoSettingGuid.ToString() + ": "); 

       UInt32 size = 1024; 
       IntPtr temp = Marshal.AllocHGlobal(1024); 
       IntPtr type = IntPtr.Zero; 

       PowerReadACValue(IntPtr.Zero, activeGuidPtr, IntPtr.Zero, VideoSettingGuid, ref type, ref temp, ref size); 

       Console.Write(Marshal.PtrToStringUni(temp)); 
       Marshal.FreeHGlobal(temp); 
       index++; 
      } 
     } 
    } 
} 

utilisant GetActivePwrScheme puis ReadPwrScheme, mais il ne semble pas fonctionner non plus. GetActivePwrScheme renvoie toujours 0, même si je change de mode de gestion de l'alimentation. J'ai également essayé d'exécuter ReadPwrScheme avec des valeurs incrémentielles (1,2,3). Je suis arrivé à 5 ou 6 mais il n'a jamais retourné le bon nombre pour la valeur que j'ai définie pour le timeout du moniteur dans le panneau de contrôle.

J'espère que j'ai totalement tort et il y a une façon beaucoup plus facile de le faire.

+0

J'ai eu de la chance avec GetActivePwrScheme sur Vista. –

Répondre

2

J'ai finalement eu un peu de chance et trouvé une fonction qui fonctionne à la fois XP et Vista - GetCurrentPowerPolicies. Il est très simple d'appeler et retourne beaucoup de paramètres actuels, y compris le réglage que je voulais VideoTimeoutAc et VideoTimeoutDc.

0

Je pense qu'ils sont abandonnés dans Vista,

Vous devez écrire des applications Power-Aware utilisant WM_POWERBROADCAST

comme indiqué dans

http://msdn.microsoft.com/en-us/library/ms700612(VS.85).aspx

et

http://msdn.microsoft.com/en-us/library/ms703398(VS.85).aspx

concept d'exemple d'application est disponible dans codeproject, Mais vous devez reprogrammer pour obtenir vos valeurs,

+0

Je voudrais réellement arriver à un réglage, ne pas recevoir d'événements d'alimentation. Je suppose que je recevrais l'événement quand un utilisateur changerait le paramètre de délai d'attente de moniteur? Merci pour le lien codeproject cependant, je vais y jeter un coup d'oeil et j'espère que je pourrais avoir une autre idée comment arriver à ce paramètre. –

+0

Oui, vous recevrez des événements en fonction des changements de l'utilisateur .. et aussi passer par le lien du projet de code, Vous aurez l'idée de mettre en œuvre. – lakshmanaraj

Questions connexes