2014-04-19 8 views
8

कुल vbs स्क्रिप्टिंग newb में काम नहीं कर रहा है। मैं एक निश्चित खुली खिड़की को बंद करने के लिए स्वचालित रूप से प्रयास कर रहा हूं, अर्थात् होस्ट्समेन नामक एक प्रोग्राम। यह विंडोज 8.1 प्रो 64 बिट पर है, और यह मेरी स्क्रिप्ट वर्तमान में दिखता है की तरह है:WshShell.AppActivate सरल vbs स्क्रिप्ट

Set WshShell = CreateObject("WScript.Shell") 
WshShell.AppActivate "HostsMan" 
WshShell.SendKeys "%{F4}" 

दूसरी पंक्ति काम करने के लिए प्रतीत नहीं होता। मुझे लाइन 3 काम पता है क्योंकि यह विंडोज शट डाउन मेनू को सक्रिय करता है। क्या मुझे कुछ याद आ रही है?

अद्यतन/अधिक जानकारी: मैन्युअल रूप से alt-F4 दर्ज करने से यह बंद हो जाता है, इसलिए मुझे पता है कि यह काम करना चाहिए। मैंने इस स्क्रिप्ट को अन्य खुली खिड़कियों के साथ भी परीक्षण किया और वे ठीक से बंद हो गए। इसके अतिरिक्त, HostsMan व्यवस्थापक विशेषाधिकारों के साथ खोला गया है, इसलिए मैंने स्क्रिप्ट को उच्चतम विशेषाधिकारों के साथ एक कार्य सेट के रूप में चलाने का प्रयास किया ताकि यह देखने के लिए कि वह ऐसा करेगा, और फिर भी नहीं जाए। लेकिन यह व्यवस्थापक विशेषाधिकारों के साथ चल रही अन्य खुली खिड़कियों के साथ काम करता है। निराशा होती!

+0

विंडो (कैप्शन बार में) का सटीक शीर्षक क्या है जिसे आप बंद करने का प्रयास कर रहे हैं? क्या यह सिर्फ "होस्ट्समेन" कहता है? – Bond

+0

हाँ, यह सिर्फ "होस्ट्समेन" कहता है। कार्य प्रबंधक में इसे "होस्ट्समेन (32 बिट)" के रूप में सूचीबद्ध किया गया है, जिसे मैंने भी आजमाया। कोई पाँसा नहीं। – user3550756

उत्तर

10

मैंने इसे भी आजमाया है, और इसे काम नहीं कर सका। विंडो क्लास के बारे में कुछ होना चाहिए, शायद, जहां AppActivate इसे शीर्ष-स्तरीय विंडो के रूप में नहीं देखता है?

किसी भी घटना में, AppActivate आपको विंडो शीर्षक के बजाय प्रक्रिया आईडी पास करने देता है। जब मैंने होस्ट्समेन स्थापित किया, तो प्रक्रिया का नाम hm.exe था, इसलिए मैं इसे नीचे दिए गए मेरे उदाहरण में उपयोग करूंगा।

Set Processes = GetObject("winmgmts:").InstancesOf("Win32_Process") 

For Each Process In Processes 
    If StrComp(Process.Name, "hm.exe", vbTextCompare) = 0 Then 

     ' Activate the window using its process ID... 
     With CreateObject("WScript.Shell") 
      .AppActivate Process.ProcessId 
      .SendKeys "%{F4}" 
     End With 

     ' We found our process. No more iteration required... 
     Exit For 

    End If 
Next 
+0

धन्यवाद! आपके समाधान का प्रयास करने से पहले, क्या इसका मतलब यह है कि यह प्रक्रिया को मार देगा? यदि ऐसा है, तो यह मेरी आवश्यकताओं के लिए काम नहीं करेगा। मेरे पास HostsMan ट्रे पर चलने के लिए सेट है, जिसे मुझे करने की ज़रूरत है, इसलिए मुझे वास्तव में जो कुछ चाहिए उसे ऑटो बंद करने का एक तरीका है। – user3550756

+0

नहीं, यह केवल प्रक्रिया * आईडी * निर्धारित करता है ताकि वह इसे 'AppActivate' पर पास कर सके। – Bond

+0

समझा। मैंने उपर्युक्त कोड का उपयोग करने का प्रयास किया, लेकिन ऐसा लगता है कि होस्टमैन की खिड़की को शीर्ष पर लाया गया है। क्या मैं खिड़की को बंद करने के लिए इसके लिए कहीं भी अपना मौजूदा कोड जोड़ना चाहता हूं? पीएस - इस पर मेरे साथ आपके धैर्य के लिए धन्यवाद। – user3550756

0

वैकल्पिक समाधान WMIService का उपयोग कर (कोई आवश्यक सभी प्रक्रियाओं के माध्यम से लूप):

Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2") 
Set colItems = objWMIService.ExecQuery("SELECT * from Win32_Process WHERE Name = '" & ProcessName & "'") 

If colItems.Count = 0 Then 
    WScript.Echo "Process not found" 
    Wscript.Quit 
End If 

For Each objProcess in colItems 
    WshShell.AppActivate(objProcess.ProcessId) 
    Exit For 
Next 
1

कुंजी यहाँ 'रन' आदेश के बाद लेकिन 'appactivate' कमांड से पहले तो एक छोटा सा विराम लगाने के लिए है आवेदन प्रक्रिया सूची में दिखाया गया है।

 WshShell.Run "calc" 
    WScript.Sleep 100 
    WshShell.AppActivate "Calculator" 
संबंधित मुद्दे