Results 1 to 11 of 11

Thread: APM and Windows

  1. #1

    Thread Starter
    Member ElectroTism's Avatar
    Join Date
    Jan 2000
    Posts
    38
    Is there a way to create an icon that you can click that would put your computer into sleep mode?
    That means, powerdown monitor and hd. (Not turn off, just power down, ie activate APM)

  2. #2
    Frenzied Member Jop's Avatar
    Join Date
    Mar 2000
    Location
    Amsterdam, the Netherlands
    Posts
    1,986
    I believe this can do the trick (POWEROFF is the same as the powermanagment I Guess, haven;t tried it
    Code:
    Const EWX_POWEROFF = &H00000008
    'You have to put this line somewhere in the code, look for yourself, I'll help ya later, me's tired :(
    ' Shutdown Flags
    Const EWX_LOGOFF = 0
    Const EWX_SHUTDOWN = 1
    Const EWX_REBOOT = 2
    Const EWX_FORCE = 4
    Const SE_PRIVILEGE_ENABLED = &H2
    Const TokenPrivileges = 3
    Const TOKEN_ASSIGN_PRIMARY = &H1
    Const TOKEN_DUPLICATE = &H2
    Const TOKEN_IMPERSONATE = &H4
    Const TOKEN_QUERY = &H8
    Const TOKEN_QUERY_SOURCE = &H10
    Const TOKEN_ADJUST_PRIVILEGES = &H20
    Const TOKEN_ADJUST_GROUPS = &H40
    Const TOKEN_ADJUST_DEFAULT = &H80
    Const SE_SHUTDOWN_NAME = "SeShutdownPrivilege"
    Const ANYSIZE_ARRAY = 1
    Private Type LARGE_INTEGER
        lowpart As Long
        highpart As Long
    End Type
    Private Type Luid
        lowpart As Long
        highpart As Long
    End Type
    Private Type LUID_AND_ATTRIBUTES
        'pLuid As Luid
        pLuid As LARGE_INTEGER
        Attributes As Long
    End Type
    Private Type TOKEN_PRIVILEGES
        PrivilegeCount As Long
        Privileges(ANYSIZE_ARRAY) As LUID_AND_ATTRIBUTES
    End Type
    Private Declare Function InitiateSystemShutdown Lib "advapi32.dll" Alias "InitiateSystemShutdownA" (ByVal lpMachineName As String, ByVal lpMessage As String, ByVal dwTimeout As Long, ByVal bForceAppsClosed As Long, ByVal bRebootAfterShutdown As Long) As Long
    Private Declare Function OpenProcessToken Lib "advapi32.dll" (ByVal ProcessHandle As Long, ByVal DesiredAccess As Long, TokenHandle As Long) As Long
    Private Declare Function GetCurrentProcess Lib "kernel32" () As Long
    Private Declare Function LookupPrivilegeValue Lib "advapi32.dll" Alias "LookupPrivilegeValueA" (ByVal lpSystemName As String, ByVal lpName As String, lpLuid As LARGE_INTEGER) As Long
    Private Declare Function AdjustTokenPrivileges Lib "advapi32.dll" (ByVal TokenHandle As Long, ByVal DisableAllPrivileges As Long, NewState As TOKEN_PRIVILEGES, ByVal BufferLength As Long, PreviousState As TOKEN_PRIVILEGES, ReturnLength As Long) As Long
    Private Declare Function GetComputerName Lib "kernel32" Alias "GetComputerNameA" (ByVal lpBuffer As String, nSize As Long) As Long
    Private Declare Function GetLastError Lib "kernel32" () As Long
    Public Function InitiateShutdownMachine(ByVal Machine As String, Optional Force As Variant, Optional Restart As Variant, Optional AllowLocalShutdown As Variant, Optional Delay As Variant, Optional Message As Variant) As Boolean
        Dim hProc As Long
        Dim OldTokenStuff As TOKEN_PRIVILEGES
        Dim OldTokenStuffLen As Long
        Dim NewTokenStuff As TOKEN_PRIVILEGES
        Dim NewTokenStuffLen As Long
        Dim pSize As Long
        If IsMissing(Force) Then Force = False
        If IsMissing(Restart) Then Restart = True
        If IsMissing(AllowLocalShutdown) Then AllowLocalShutdown = False
        If IsMissing(Delay) Then Delay = 0
        If IsMissing(Message) Then Message = ""
        'Make sure the Machine-name doesn't start with '\\'
        If InStr(Machine, "\\") = 1 Then
            Machine = Right(Machine, Len(Machine) - 2)
        End If
        'check if it's the local machine that's going to be shutdown
        If (LCase(GetMyMachineName) = LCase(Machine)) Then
            'may we shut this computer down?
            If AllowLocalShutdown = False Then Exit Function
            'open access token
            If OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY, hProc) = 0 Then
                MsgBox "OpenProcessToken Error: " & GetLastError()
                Exit Function
            End If
            'retrieve the locally unique identifier to represent the Shutdown-privilege name
            If LookupPrivilegeValue(vbNullString, SE_SHUTDOWN_NAME, OldTokenStuff.Privileges(0).pLuid) = 0 Then
                MsgBox "LookupPrivilegeValue Error: " & GetLastError()
                Exit Function
            End If
            NewTokenStuff = OldTokenStuff
            NewTokenStuff.PrivilegeCount = 1
            NewTokenStuff.Privileges(0).Attributes = SE_PRIVILEGE_ENABLED
            NewTokenStuffLen = Len(NewTokenStuff)
            pSize = Len(NewTokenStuff)
            'Enable shutdown-privilege
            If AdjustTokenPrivileges(hProc, False, NewTokenStuff, NewTokenStuffLen, OldTokenStuff, OldTokenStuffLen) = 0 Then
                MsgBox "AdjustTokenPrivileges Error: " & GetLastError()
                Exit Function
            End If
            'initiate the system shutdown
            If InitiateSystemShutdown("\\" & Machine, Message, Delay, Force, Restart) = 0 Then
                Exit Function
            End If
            NewTokenStuff.Privileges(0).Attributes = 0
            'Disable shutdown-privilege
            If AdjustTokenPrivileges(hProc, False, NewTokenStuff, Len(NewTokenStuff), OldTokenStuff, Len(OldTokenStuff)) = 0 Then
                Exit Function
            End If
        Else
            'initiate the system shutdown
            If InitiateSystemShutdown("\\" & Machine, Message, Delay, Force, Restart) = 0 Then
                Exit Function
            End If
        End If
        InitiateShutdownMachine = True
    End Function
    Function GetMyMachineName() As String
        Dim sLen As Long
        'create a buffer
        GetMyMachineName = Space(100)
        sLen = 100
        'retrieve the computer name
        If GetComputerName(GetMyMachineName, sLen) Then
            GetMyMachineName = Left(GetMyMachineName, sLen)
        End If
    End Function
    Private Sub Form_Load()
        'KPD-Team 2000
        'URL: http://www.allapi.net/
        'E-Mail: [email protected]
        InitiateShutdownMachine GetMyMachineName, True, True, True, 60, "You initiated a system shutdown..."
    End Sub
    Jop - validweb.nl

    Alcohol doesn't solve any problems, but then again, neither does milk.

  3. #3
    Guest
    Jop:

    PowerOff?!
    That shuts down the system and turns off the power, like when you flipped the power switch to "off".

    Here's how you sleep:

    Code:
    Public Declare Function SetSleep Lib "kernel32" Alias "SetSystemPowerState" (ByVal fSuspend As Long, ByVal fForce As Long) As Long
    And to use it type:

    Code:
      SetSleep False, True
    Ignore the fSuspend flag for it is nothing of worth here.

  4. #4
    Frenzied Member Jop's Avatar
    Join Date
    Mar 2000
    Location
    Amsterdam, the Netherlands
    Posts
    1,986
    Oops sorry, didn't knew that (you learn new hings every day!)
    Jop - validweb.nl

    Alcohol doesn't solve any problems, but then again, neither does milk.

  5. #5

    Thread Starter
    Member ElectroTism's Avatar
    Join Date
    Jan 2000
    Posts
    38

    ok..

    thanks, but uhh..
    Escaflowne:
    when I use that code, I get disconnected of internet, My hd doesnt power down, and My monitor does sleep, but it refuses to come back on...




  6. #6
    Guest
    It's supposed to put your computer in standby mode, but windows has a VERY BAD defination of standby, so maybe using

    Code:
    SetSleep True, False
    will work?

    The last param, when TRUE, forces a hard sleep, so if it's false, it should be OK.

  7. #7

    Thread Starter
    Member ElectroTism's Avatar
    Join Date
    Jan 2000
    Posts
    38
    Originally posted by Escaflowne
    It's supposed to put your computer in standby mode, but windows has a VERY BAD defination of standby, so maybe using

    Code:
    SetSleep True, False
    will work?

    The last param, when TRUE, forces a hard sleep, so if it's false, it should be OK.
    now it just doesnt work

    *Could* be because the first time i tried, I was in win95, now I'm in win2k... I checked, though, win2k APM is enabled..


    ok, it probably is win2k, because i retried the
    false,true line and it doesnt even respond...
    Also, I need it to work in win2k, because win2k doesnt respond to my sleep button while win95 does, so I need to be able to easily sleep instead of waiting 10-15 mins...


    oh one more thing, it would be preferred if i could just
    hit my sleep button too , so if you know how i could
    make win2k respond to it, by all means, tell me!!

    its a toshiba infinia (about 3 years old)

    [Edited by ElectroTism on 10-08-2000 at 05:54 PM]

  8. #8
    Guest
    As I've said in another post before, some Win9x APIs won't work on WinNT (Win2000 = WinNT5).

    Code:
    'You'll notice that this is Jop's code without the powering off.
    Const Force = False
    Const EWX_LOGOFF = 0
    Const EWX_SHUTDOWN = 1
    Const EWX_REBOOT = 2
    Const EWX_FORCE = 4
    Const SE_PRIVILEGE_ENABLED = &H2
    Const TokenPrivileges = 3
    Const TOKEN_ASSIGN_PRIMARY = &H1
    Const TOKEN_DUPLICATE = &H2
    Const TOKEN_IMPERSONATE = &H4
    Const TOKEN_QUERY = &H8
    Const TOKEN_QUERY_SOURCE = &H10
    Const TOKEN_ADJUST_PRIVILEGES = &H20
    Const TOKEN_ADJUST_GROUPS = &H40
    Const TOKEN_ADJUST_DEFAULT = &H80
    Const SE_SHUTDOWN_NAME = "SeShutdownPrivilege"
    Const ANYSIZE_ARRAY = 1
    Private Type LARGE_INTEGER
        lowpart As Long
        highpart As Long
    End Type
    Private Type Luid
        lowpart As Long
        highpart As Long
    End Type
    Private Type LUID_AND_ATTRIBUTES
        'pLuid As Luid
        pLuid As LARGE_INTEGER
        Attributes As Long
    End Type
    Private Type TOKEN_PRIVILEGES
        PrivilegeCount As Long
        Privileges(ANYSIZE_ARRAY) As LUID_AND_ATTRIBUTES
    End Type
    Private Declare Function SetSleep Lib "kernel32" Alias "SetSystemPowerState" (ByVal fSuspend As Long, ByVal fForce As Long) As Long
    Private Declare Function OpenProcessToken Lib "advapi32.dll" (ByVal ProcessHandle As Long, ByVal DesiredAccess As Long, TokenHandle As Long) As Long
    Private Declare Function GetCurrentProcess Lib "kernel32" () As Long
    Private Declare Function LookupPrivilegeValue Lib "advapi32.dll" Alias "LookupPrivilegeValueA" (ByVal lpSystemName As String, ByVal lpName As String, lpLuid As LARGE_INTEGER) As Long
    Private Declare Function AdjustTokenPrivileges Lib "advapi32.dll" (ByVal TokenHandle As Long, ByVal DisableAllPrivileges As Long, NewState As TOKEN_PRIVILEGES, ByVal BufferLength As Long, PreviousState As TOKEN_PRIVILEGES, ReturnLength As Long) As Long
    Private Declare Function GetComputerName Lib "kernel32" Alias "GetComputerNameA" (ByVal lpBuffer As String, nSize As Long) As Long
    Private Declare Function GetLastError Lib "kernel32" () As Long
    
    Public Function SleepSystem(ByVal Machine As String, Optional Force As Variant, Optional Restart As Variant, Optional AllowLocalShutdown As Variant, Optional Delay As Variant, Optional Message As Variant) As Boolean
        Dim hProc As Long
        Dim OldTokenStuff As TOKEN_PRIVILEGES
        Dim OldTokenStuffLen As Long
        Dim NewTokenStuff As TOKEN_PRIVILEGES
        Dim NewTokenStuffLen As Long
        Dim pSize As Long
        If IsMissing(Force) Then Force = False
        If IsMissing(Restart) Then Restart = True
        If IsMissing(AllowLocalShutdown) Then AllowLocalShutdown = False
        If IsMissing(Delay) Then Delay = 0
        If IsMissing(Message) Then Message = ""
        'Make sure the Machine-name doesn't start with '\\'
        If InStr(Machine, "\\") = 1 Then
            Machine = Right(Machine, Len(Machine) - 2)
        End If
        'check if it's the local machine that's going to be shutdown
        If (LCase(GetMyMachineName) = LCase(Machine)) Then
            'may we shut this computer down?
            If AllowLocalShutdown = False Then Exit Function
            'open access token
            If OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES Or TOKEN_QUERY, hProc) = 0 Then
                MsgBox "OpenProcessToken Error: " & GetLastError()
                Exit Function
            End If
            'retrieve the locally unique identifier to represent the Shutdown-privilege name
            If LookupPrivilegeValue(vbNullString, SE_SHUTDOWN_NAME, OldTokenStuff.Privileges(0).pLuid) = 0 Then
                MsgBox "LookupPrivilegeValue Error: " & GetLastError()
                Exit Function
            End If
            NewTokenStuff = OldTokenStuff
            NewTokenStuff.PrivilegeCount = 1
            NewTokenStuff.Privileges(0).Attributes = SE_PRIVILEGE_ENABLED
            NewTokenStuffLen = Len(NewTokenStuff)
            pSize = Len(NewTokenStuff)
            'Enable shutdown-privilege
            If AdjustTokenPrivileges(hProc, False, NewTokenStuff, NewTokenStuffLen, OldTokenStuff, OldTokenStuffLen) = 0 Then
                MsgBox "AdjustTokenPrivileges Error: " & GetLastError()
                Exit Function
            End If
            'initiate the system shutdown
            If SetSleep(Not Force, Force) = 0 Then
                Exit Function
            End If
            NewTokenStuff.Privileges(0).Attributes = 0
            'Disable shutdown-privilege
            If AdjustTokenPrivileges(hProc, False, NewTokenStuff, Len(NewTokenStuff), OldTokenStuff, Len(OldTokenStuff)) = 0 Then
                Exit Function
            End If
        Else
            'initiate the system shutdown
            If SetSleep(Not Force, Force) = 0 Then
                Exit Function
            End If
        End If
        SleepSystem = True
    End Function
    Function GetMyMachineName() As String
        Dim sLen As Long
        'create a buffer
        GetMyMachineName = Space (100)
        sLen = 100
        'retrieve the computer name
        If GetComputerName(GetMyMachineName, sLen) Then
            GetMyMachineName = Left(GetMyMachineName, sLen)
        End If
    End Function
    Private Sub Form_Load()
        'KPD-Team 2000
        'URL: http://www.allapi.net/
        'E-Mail: [email protected]
        InitiateShutdownMachine GetMyMachineName, True, True, True, 60, "You initiated a system shutdown..."
    End Sub
    This may not work for I have not tested (it's impossible because I have win 98). If not, try adjusting Force to True.

  9. #9

    Thread Starter
    Member ElectroTism's Avatar
    Join Date
    Jan 2000
    Posts
    38

    Unhappy still no

    still no

  10. #10
    Guest
    Hmm...

    Err...

    That's beyond my knowledge. Megatron? We need some help around here! Megatron!!!

    All that I can say because I'm not familiar with WinNT, is that maybe it doesn't support it...

    Sorry.

  11. #11

    Thread Starter
    Member ElectroTism's Avatar
    Join Date
    Jan 2000
    Posts
    38

    thanks though

    thanks for you help though...


    p.s. It *doesnt* have to be a programming solution..maybe there is a command I can execute or something...
    I know the APM does work in win2k because I let it auto wait 10 mins and it powers down, just need to do it when I tell it to instead of waiting
    (and uhh...changing the time limit everytime isn't what i had in mind either )

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  



Click Here to Expand Forum to Full Width