سؤال

لديّ مهمة تزامن طويلة جدًا لا يمكن مقاطعة عن طريق توفير الشاشة أو أوضاع توفير الطاقة العدوانية. أرغب في إجراء مكالمة API واحدة لإيقاف وضع حفظ الطاقة ثم استعادته بمجرد الانتهاء من المهمة.

يتم تجميع الكود التالي معًا من مختلف المنشورات الأخرى ولكن ليس له أي تأثير على إعدادات إدارة الطاقة في XP. ما الخطأ الذي افعله؟ تيا!

Private Declare Function SetThreadExecutionState Lib "kernel32" (ByVal esFlags As Long) As Long

Public Enum EXECUTION_STATE As Integer

    ES_CONTINUOUS = &H80000000
    ES_DISPLAY_REQUIRED = &H2
    ES_SYSTEM_REQUIRED = &H1
    ES_AWAYMODE_REQUIRED = &H40

End Enum

Public Shared Sub PowerSaveOff()
    SetThreadExecutionState(EXECUTION_STATE.ES_DISPLAY_REQUIRED Or EXECUTION_STATE.ES_CONTINUOUS)
End Sub

Public Shared Sub PowerSaveOn()
    SetThreadExecutionState(EXECUTION_STATE.ES_CONTINUOUS)
End Sub

فيما يلي إعدادات Systems Screensaver و PowerMode:alt text http://img87.imageshack.us/img87/1600/25251376.jpg ALT TEXT http://img403.imageshack.us/img403/8145/73347627.jpg

هل كانت مفيدة؟

المحلول

أضفت EXECUTION_STATE.ES_SYSTEM_REQUIRED, ، الذي "يجبر النظام على أن يكون في حالة العمل عن طريق إعادة تعيين مؤقت الخمول في النظام" ، ويمنع النظام من إدخال حالة توفير الطاقة. لقد قمت أيضًا بتغيير اتفاقية استدعاء API للاستخدام EXECUTION_STATE, ، ملفوفة كل شيء في فئة فائدة بسيطة مع بعض الوثائق.

''' <summary>
''' Simple power manager class that enables applications to inform the system
''' that it is in use, thereby preventing the system from entering the sleeping
''' power state or turning off the display while the application is running.
''' </summary>
Public Class PowerManager

#Region " Private Sub New "
    Private Sub New()
        'keep compiler from creating default constructor to create utility class
    End Sub
#End Region

    ''' <summary>
    ''' Enables applications to inform the system that it is in use, thereby preventing the system from entering the sleeping power state or turning off the display while the application is running.
    ''' </summary>
    ''' <param name="esFlags">The thread's execution requirements. This parameter can be one or more of the EXECUTION_STATE values.</param>
    ''' <returns>
    ''' <para>If the function succeeds, the return value is the previous thread execution state, as a EXECUTION_STATE value.</para>
    ''' <para>If the function fails, the return value is NULL.</para>
    '''</returns>
    ''' <remarks>
    ''' <para>This function does not stop the screen saver from executing.</para>
    ''' <para>http://msdn.microsoft.com/en-us/library/aa373208.aspx</para>
    ''' </remarks>
    Private Declare Function SetThreadExecutionState Lib "kernel32" (ByVal esFlags As EXECUTION_STATE) As EXECUTION_STATE

    Public Enum EXECUTION_STATE As Integer

        ''' <summary>
        ''' Informs the system that the state being set should remain in effect until the next call that uses ES_CONTINUOUS and one of the other state flags is cleared.
        ''' </summary>
        ES_CONTINUOUS = &H80000000

        ''' <summary>
        ''' Forces the display to be on by resetting the display idle timer.
        ''' </summary>
        ES_DISPLAY_REQUIRED = &H2

        ''' <summary>
        ''' Forces the system to be in the working state by resetting the system idle timer.
        ''' </summary>
        ES_SYSTEM_REQUIRED = &H1

    End Enum

    Public Shared Function PowerSaveOff() As EXECUTION_STATE
        Return SetThreadExecutionState(EXECUTION_STATE.ES_SYSTEM_REQUIRED Or EXECUTION_STATE.ES_DISPLAY_REQUIRED Or EXECUTION_STATE.ES_CONTINUOUS)
    End Function

    Public Shared Function PowerSaveOn() As EXECUTION_STATE
        Return SetThreadExecutionState(EXECUTION_STATE.ES_CONTINUOUS)
    End Function

End Class

Public Class Form1

    Private _cancel As Boolean

    Private Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click

        'set system standby to one minute

        _cancel = False

        PowerManager.PowerSaveOff()

        Do Until _cancel
            My.Application.DoEvents()
        Loop

        PowerManager.PowerSaveOn()

        'do not forget to restore your power settings

    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        _cancel = True
    End Sub

End Class

نصائح أخرى

هذا يعمل بالنسبة لي:

Private Const SPI_SETSCREENSAVEACTIVE = 17
Private Const SPI_SETSCREENSAVETIMEOUT = 15
Private Const SPIF_SENDWININICHANGE = &H2
Private Const SPIF_UPDATEINIFILE = &H1
Private Declare Function SystemParametersInfo Lib "user32" Alias "SystemParametersInfoA" (ByVal uAction As Long, ByVal uParam As Long, ByVal lpvParam As Long, ByVal fuWinIni As Long) As Long

Private Sub Form_Load()
Call SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, 0, 0, SPIF_UPDATEINIFILE + SPIF_SENDWININICHANGE)
End Sub

Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
Call SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, 1, 0, SPIF_UPDATEINIFILE + SPIF_SENDWININICHANGE)
End Sub
Microsoft.Win32.RegistryKey rkScreenSaver =
        Microsoft.Win32.Registry.CurrentUser.OpenSubKey(@" Control Panel\Desktop", true );
if ( (string)rkScreenSaver.GetValue( "ScreenSaveActive" ) == "1" )
{
   rkScreenSaver.SetValue( "ScreenSaveActive", "0" );
   rkScreenSaver.Close( );
}

هذا يجب أن تعمل من أجلك.

بدلاً من ذلك ، لماذا لا تمدد الوقت لتوفير الشاشة إلى 10 دقائق؟

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top