क्या बिजली की घटनाओं पर एक कार्यक्रम को निष्पादित करने का एक तरीका है?


11

मैं मूल रूप से एक एप्लिकेशन को निष्पादित करने का एक तरीका ढूंढ रहा हूं जब मेरा लैपटॉप बैटरी की शक्ति में बदलाव करता है और इसी तरह, जब यह एसी में वापस आता है।

क्या विंडोज में एक अंतर्निहित हुक या एक तृतीय-पक्ष एप्लिकेशन है जो मुझे इस तरह की घटनाओं का जवाब देने की अनुमति देगा?

संपादित करें

मैंने टास्कसोल्डर में एक "पावर" घटना पर एक कार्य को बंद करने की कोशिश की है, लेकिन बैटरी पर स्विच करते समय कोई भी घटना लॉग नहीं लगती है।


मुझे डूबने का अहसास क्यों है कि मुझे इस ऐप को लिखने की ज़रूरत है ..
रयान एमरेल

एक ऐप काम करेगा, लेकिन आपको बस एक स्क्रिप्ट की आवश्यकता हो सकती है।
bw

अरे यार, मुझे पार्टी में लगभग छह साल देर हो गई थी, लेकिन मुझे लगता है कि मुझे देखने लायक कुछ मिल गया है ...
FoxDeploy

जवाबों:


8

मैंने एक एप्लिकेशन ( http://batterysaver.codeplex.com/ ) लिखा है जो एक पावर मोड चेंज संदेश के लिए सुनेगा और एक्सएमएल कॉन्फ़िगरेशन के आधार पर कार्रवाई निष्पादित करेगा।

यदि कोई और इसका उपयोग कर सकता है, या इसे बढ़ा सकता है, तो भयानक। अगर कुछ बेहतर है, तो कृपया इसे पोस्ट करें।


एन्हांसमेंट के रूप में, GetSystemPowerStatus मतदान करने के बजाय, एक WM_POWERBROADCAST संदेश प्राप्त करने के लिए एक एप्लिकेशन बनाता है जो विंडोज़ बिजली की स्थिति में परिवर्तन होने पर भेजता है: msdn.microsoft.com/en-us/library/aaa3247%28VS.85%29.aspx
shf301

@ shf301 - टिप के लिए धन्यवाद; मैंने इसे पावर मोड चेंज ईवेंट का जवाब देने के लिए अपडेट किया।
रयान एमराल

@RyanEmerle अच्छा ऐप!
Moab

@RyanEmerle बहुत अच्छा ऐप सहमत!
Cosco Tech

अगर मुझे पावर इवेंट्स में बैटरी प्रोफ़ाइल बदलना है, तो मुझे कॉन्फ़िगरेशन में क्या जोड़ना चाहिए?
सिमोंगक

4

एक साधारण कमांड के बारे में न जानें, जो आप इसके लिए चला सकते हैं, लेकिन स्क्रिप्टिंग को ऐसा करने में सक्षम होना चाहिए।

PowerShell या WSH में Win32_PowerManagementEvent इवेंट को इंटरसेप्ट करने का प्रयास करें । Tomshardware लेख में कुछ vbscript कोड हैं, लेकिन मुझे लगता है कि आपको इवेंटटाइप 10 (पावरस्टेट परिवर्तन) के लिए एक केस की आवश्यकता होगी। StackOverflow में कुछ विचार हैं कि मुझे कैसे पता चल सकता है जब विंडोज नींद या हाइबरनेट मोड में / बाहर जा रहा है? , हालांकि आपको नींद / हाइबरनेट के बजाय पावर स्टेट परिवर्तन को संभालने के लिए विचार का विस्तार करना होगा। आपको इस प्रश्न के लिए कोड में कुछ विचार भी मिल सकते हैं कि कैसे सस्पेंड / रिज्यूम पर नज़र रखने के लिए कोई व्यक्ति ManagementEventWatcher का उपयोग करता है?

संपादित करें: वास्तव में, कुछ इस तरह का प्रयास करें। यह पूरी तरह से एक साथ हैक किया गया है, इसलिए यह सुंदर नहीं है। यदि आप डीसी या एसी पावर में परिवर्तन का पता लगाना चाहते हैं तो इको स्टेटमेंट बदल दें। साथ दौड़ोcscript power.vbs

power.vbs

Dim battery_status, prev_status
prev_status = CheckBattery
Set colMonitoredEvents = GetObject("winmgmts:\\.\root\cimv2")._
    ExecNotificationQuery("Select * from Win32_PowerManagementEvent")
Do
    Set strLatestEvent = colMonitoredEvents.NextEvent
    If strLatestEvent.EventType = 10 Then
        battery_status = CheckBattery
        If battery_status <> prev_status Then
            If battery_status = 1 Then
                Wscript.Echo "DC power"
            ElseIf battery_status = 2 Then
                Wscript.Echo "AC power"
            End If
        End If
    End If
    prev_status = battery_status
Loop

Function CheckBattery
    Dim oWMI, items, item
    Set oWMI = GetObject("winmgmts:\\.\root\cimv2")
    Set items = oWMI.ExecQuery("Select * from Win32_Battery",,48)
    For Each item in items
        If item.BatteryStatus = 1 Then
            CheckBattery = 1
            Exit Function
        ElseIf item.BatteryStatus = 2 then
        CheckBattery = 2
            Exit Function
        End If
    Next
End Function

बैटरी पावर के संरक्षण के लिए एक राज्य से दूसरे राज्य में संक्रमण होने पर अनुप्रयोगों को शुरू / बंद करना है। इसलिए मैं भारी स्क्रिप्ट चलाकर उद्देश्य को हराना नहीं चाहता (WMI थोड़ा भारी है)। विस्तृत उत्तर के लिए +1।
रयान एमरेल

@ रियान - ठीक है, हाँ। WM_POWERBROADCAST दृष्टिकोण के लिए पंजीकरण करने वाला एक आवेदन उस मामले में बेहतर है।
bw

2

मुझे बिल के दृष्टिकोण से प्यार है, लेकिन वह आपको नहीं बताता है कि पावरशेल में WMI इवेंट के लिए पंजीकरण कैसे करें, इसलिए यहां यह कैसे करना है।

यदि आप चाहते हैं कि आपका कोड केवल तभी ट्रिगर हो, जब सिस्टम पावर स्टेट परिवर्तित हो, तो यहाँ वर्णित है , इस कोड का उपयोग करें।

Register-WMIEvent -query "Select * From Win32_PowerManagementEvent" `
 -sourceIdentifier "Power" `
 -action {
     #YourCodeHere
      }

जब भी बिजली की स्थिति बदलती है, तो आप इस उपकरण को चालू करेंगे, चाहे आप डिवाइस को प्लग इन करें, या इसे अनप्लग करें। तो आप आगे रुक कर सवाल पूछने के लिए रुक सकते हैं:

मैं सत्ता पर हूं या नहीं?

सौभाग्य से हम डब्ल्यूएमआई क्लास के माध्यम से ऐसा कर सकते हैं BatteryStatus, इसलिए यहां पूर्ण निर्माण है जिसका उपयोग मैं केवल एक ऑपरेशन चलाने के लिए करता हूं जब कोई पावर इवेंट बदलता है, और उसके बाद ही जब मैं पावर पर नहीं होता हूं।

Register-WMIEvent -query "Select * From Win32_PowerManagementEvent" `
  -sourceIdentifier "Power" `
  -action {
      if ([BOOL](Get-WmiObject -Class BatteryStatus -Namespace root\wmi).PowerOnLine ){
         #Device is plugged in now, do this action
         write-host "Power on!"
     }
    else{
        #Device is NOT plugged in now, do this action
        write-host "Now on battery, locking..."
        [NativeMethods]::LockWorkStation()
     }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.