wraithdu

Monitor Laptop Lid State

14 posts in this topic

#1 ·  Posted (edited)

NOTE: supported on Vista+

This is a demo on monitoring the state of a laptop's lid. Notice how you can't make a laptop lock when you close the lid? Here's one solution:

Global Const $WM_POWERBROADCAST = 0x0218
; GUID_LIDSWITCH_STATE_CHANGE GUID
; 0xBA3E0F4D, 0xB817, 0x4094, 0xA2, 0xD1, 0xD5, 0x63, 0x79, 0xE6, 0xA0, 0xF3
Global Const $GUID_LIDSWITCH_STATE_CHANGE = DllStructCreate("byte[16]")
DllStructSetData($GUID_LIDSWITCH_STATE_CHANGE, 1, Binary("0x4D0F3EBA17B89440A2D1D56379E6A0F3"))

; create gui and register notification
Global $GUI = GUICreate("")
GUIRegisterMsg($WM_POWERBROADCAST, "__WM_POWER")
Global $hPower = DllCall("user32.dll", "handle", "RegisterPowerSettingNotification", "handle", $GUI, "ptr", DllStructGetPtr($GUID_LIDSWITCH_STATE_CHANGE), "dword", 0)
GUISetState()

Do
Until GUIGetMsg() = -3

; unregister notification
DllCall("user32.dll", "bool", "UnregisterPowerSettingNotification", "handle", $hPower[0])

Func __WM_POWER($hwnd, $msg, $wparam, $lparam)
    #forceref $hwnd
    Local Const $PBT_POWERSETTINGCHANGE = 0x8013
    ; Data member is variable depending on notification
    ; the size of the Data member is returned in DataLength
    Local Const $POWERBROADCAST_SETTING = "byte[16];dword DataLength;byte Data"

    Switch $msg
        Case $WM_POWERBROADCAST
            Switch $wparam
                Case $PBT_POWERSETTINGCHANGE
                    Local $PBT_PSC = DllStructCreate($POWERBROADCAST_SETTING, $lparam)
                    ; GUID of registered notification is the first member of the structure
                    Switch DllStructGetData($PBT_PSC, 1)
                        Case DllStructGetData($GUID_LIDSWITCH_STATE_CHANGE, 1)
                            ; for this notification, Data is an int representing the lid state
                            Local $data = DllStructCreate("int", DllStructGetPtr($PBT_PSC, "Data"))
                            _LidStateChange(DllStructGetData($data, 1))
                            ;
                            Return 1
                    EndSwitch
            EndSwitch
    EndSwitch

    Return "GUI_RUNDEFMSG"
EndFunc

Func _LidStateChange($iState)
    Static $iPrevious = -1
    If $iPrevious = -1 Then
        ; first fire, current state
        $iPrevious = $iState
        Return
    ElseIf $iPrevious = $iState Then
        Return
    Else
        $iPrevious = $iState
    EndIf
    ; lid state:
    ; 0 -> closed
    ; 1 -> open
    Switch $iState
        Case 0
            ConsoleWrite("lid closed" & @CRLF)
            DllCall("user32.dll", "bool", "LockWorkStation")
        Case 1
            ConsoleWrite("lid opened" & @CRLF)
    EndSwitch
EndFunc
Edited by wraithdu

Share this post


Link to post
Share on other sites



Nice wraithdu! I'm always learning from you, especially when you released your MD5Hash project.


_AdapterConnections()_AlwaysRun()_AppMon()_AppMonEx()_BinaryBin()_CheckMsgBox()_CmdLineRaw()_ContextMenu()_ConvertLHWebColor()/_ConvertSHWebColor()_DesktopDimensions()_DisplayPassword()_DotNet_Load()/_DotNet_Unload()_Fibonacci()_FileCompare()_FileCompareContents()_FileNameByHandle()_FilePrefix/SRE()_FindInFile()_GetBackgroundColor()/_SetBackgroundColor()_GetConrolID()_GetCtrlClass()_GetDirectoryFormat()_GetDriveMediaType()_GetFilename()/_GetFilenameExt()_GetHardwareID()_GetIP()_GetIP_Country()_GetOSLanguage()_GetSavedSource()_GetStringSize()_GetSystemPaths()_GetURLImage()_GIFImage()_GoogleWeather()_GUICtrlCreateGroup()_GUICtrlListBox_CreateArray()_GUICtrlListView_CreateArray()_GUICtrlListView_SaveCSV()_GUICtrlListView_SaveHTML()_GUICtrlListView_SaveTxt()_GUICtrlListView_SaveXML()_GUICtrlMenu_Recent()_GUICtrlMenu_SetItemImage()_GUICtrlTreeView_CreateArray()_GUIDisable()_GUIImageList_SetIconFromHandle()_GUIRegisterMsg()_GUISetIcon()_Icon_Clear()/_Icon_Set()_IdleTime()_InetGet()_InetGetGUI()_InetGetProgress()_IPDetails()_IsFileOlder()_IsGUID()_IsHex()_IsPalindrome()_IsRegKey()_IsStringRegExp()_IsSystemDrive()_IsUPX()_IsValidType()_IsWebColor()_Language()_Log()_MicrosoftInternetConnectivity()_MSDNDataType()_PathFull/GetRelative/Split()_PathSplitEx()_PrintFromArray()_ProgressSetMarquee()_ReDim()_RockPaperScissors()/_RockPaperScissorsLizardSpock()_ScrollingCredits_SelfDelete()_SelfRename()_SelfUpdate()_SendTo()_ShellAll()_ShellFile()_ShellFolder()_SingletonHWID()_SingletonPID()_Startup()_StringCompact()_StringIsValid()_StringRegExpMetaCharacters()_StringReplaceWholeWord()_StringStripChars()_Temperature()_TrialPeriod()_UKToUSDate()/_USToUKDate()_WinAPI_Create_CTL_CODE()_WinAPI_CreateGUID()_WMIDateStringToDate()/_DateToWMIDateString()Au3 script parsingAutoIt SearchAutoIt3 PortableAutoIt3WrapperToPragmaAutoItWinGetTitle()/AutoItWinSetTitle()CodingDirToHTML5FileInstallrFileReadLastChars()GeoIP databaseGUI - Only Close ButtonGUI ExamplesGUICtrlDeleteImage()GUICtrlGetBkColor()GUICtrlGetStyle()GUIEventsGUIGetBkColor()Int_Parse() & Int_TryParse()IsISBN()LockFile()Mapping CtrlIDsOOP in AutoItParseHeadersToSciTE()PasswordValidPasteBinPosts Per DayPreExpandProtect GlobalsQueue()Resource UpdateResourcesExSciTE JumpSettings INISHELLHOOKShunting-YardSignature CreatorStack()Stopwatch()StringAddLF()/StringStripLF()StringEOLToCRLF()VSCROLLWM_COPYDATAMore Examples...

Updated: 04/09/2015

Share this post


Link to post
Share on other sites

#3 ·  Posted (edited)

I'm om Windows 8.  I run the demo and get no output.  I set my Laptop lid close action to "do nothing" but I get no console output at all from the demo when I close and open the lid. 

Edited by MilesAhead

Share this post


Link to post
Share on other sites

But the lid does lock.. so it works.  I'll have to look it over more.  I'm searching for a lid locker for someone on another forum and found this thread.  :)  Very cool.  I've found a lot of threads where it's been attempted but not achieved.  :)

Share this post


Link to post
Share on other sites

How are you running the script and where are you expecting console output? I just tested on Win 8.1 and I get the proper SciTE output in the console and the laptop locks when closing the lid.

Share this post


Link to post
Share on other sites

How are you running the script and where are you expecting console output? I just tested on Win 8.1 and I get the proper SciTE output in the console and the laptop locks when closing the lid.

 

How are you running the script and where are you expecting console output? I just tested on Win 8.1 and I get the proper SciTE output in the console and the laptop locks when closing the lid.

I tried running in Scite.  The lock worked but no text output.  I tried from a command prompt with compiled version.  Same thing I'm on Windows 8 pre SP.  Maybe that's the difference.

Share this post


Link to post
Share on other sites

Are you running it using #RequireAdmin?


If I posted any code, assume that code was written using the latest release version unless stated otherwise. Also, if it doesn't work on XP I can't help with that because I don't have access to XP, and I'm not going to.
Give a programmer the correct code and he can do his work for a day. Teach a programmer to debug and he can do his work for a lifetime - by Chirag Gude
How to ask questions the smart way!

I hereby grant any person the right to use any code I post, that I am the original author of, on the autoitscript.com forums, unless I've specifically stated otherwise in the code or the thread post. If you do use my code all I ask, as a courtesy, is to make note of where you got it from.

Back up and restore Windows user files _Array.au3 - Modified array functions that include support for 2D arrays.  -  ColorChooser - An add-on for SciTE that pops up a color dialog so you can select and paste a color code into a script.  -  Customizable Splashscreen GUI w/Progress Bar - Create a custom "splash screen" GUI with a progress bar and custom label.  -  _FileGetProperty - Retrieve the properties of a file  -  SciTE Toolbar - A toolbar demo for use with the SciTE editor  -  GUIRegisterMsg demo - Demo script to show how to use the Windows messages to interact with controls and your GUI.  -   Latin Square password generator

Share this post


Link to post
Share on other sites

I was not, but I see your point in asking.

@MilesAhead

If you're using #RequireAdmin then SciTE cannot capture the console output. Further, you must compile the script as a console application if you want command prompt to show you console output. Use

#pragma compile(Console, true)

Share this post


Link to post
Share on other sites

#9 ·  Posted (edited)

Are you running it using #RequireAdmin?

 

No.  I just pasted the script in Scite and saved it to an .au3 file.

Edit: Ok. I added that (#requireadmin I mean) and it works.  :)

Edit2:  I just got this Laptop.  Seems in W8 everything has to be run as admin.  I can't even save a file in Scite without it.  pita.  :)

Edited by MilesAhead

Share this post


Link to post
Share on other sites

I find that strange. I'm not running with any elevation on 8.1, script or compiled version, from desktop. No issues.

Share this post


Link to post
Share on other sites

Hopefully they responded to user complaints?  As far as I remember on W7 I turned UAC either off or to the lowest setting and that was that.  This W8 I can't even save a file in any of the Program Files trees without run as admin.. even with UAC all the way down on the slider.  It's really annoying.

Share this post


Link to post
Share on other sites

I believe if you run SciTE as an admin, then you won't need to use it in your scripts for testing.


If I posted any code, assume that code was written using the latest release version unless stated otherwise. Also, if it doesn't work on XP I can't help with that because I don't have access to XP, and I'm not going to.
Give a programmer the correct code and he can do his work for a day. Teach a programmer to debug and he can do his work for a lifetime - by Chirag Gude
How to ask questions the smart way!

I hereby grant any person the right to use any code I post, that I am the original author of, on the autoitscript.com forums, unless I've specifically stated otherwise in the code or the thread post. If you do use my code all I ask, as a courtesy, is to make note of where you got it from.

Back up and restore Windows user files _Array.au3 - Modified array functions that include support for 2D arrays.  -  ColorChooser - An add-on for SciTE that pops up a color dialog so you can select and paste a color code into a script.  -  Customizable Splashscreen GUI w/Progress Bar - Create a custom "splash screen" GUI with a progress bar and custom label.  -  _FileGetProperty - Retrieve the properties of a file  -  SciTE Toolbar - A toolbar demo for use with the SciTE editor  -  GUIRegisterMsg demo - Demo script to show how to use the Windows messages to interact with controls and your GUI.  -   Latin Square password generator

Share this post


Link to post
Share on other sites

I believe if you run SciTE as an admin, then you won't need to use it in your scripts for testing.

 

I have the exe set to Run As Administrator.in compatibility tab.

Share this post


Link to post
Share on other sites

Win7 X64

 AutoIt Version: 3.3.12.0

Script does not work for me. Shows blank GUI and thats it. Nothing in the console.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now