2011-08-08 7 views
6

मैं वर्तमान में WPF में एक क्लिक ईवेंट का उपयोग कर विंडोज़ टास्क मैनेजर का आह्वान कर रहा हूं। घटना बस 'Process.Start ("taskmgr") निष्पादित करती है।'प्रदर्शन' टैब के साथ विंडोज़ टास्क मैनेजर को आमंत्रित करना

मेरा सवाल यह है कि प्रक्रिया शुरू होने/प्रदर्शित होने पर टास्क मैनेजर के अंदर कौन सा टैब चुना जाता है, यह चुनने का कोई तरीका है? जब भी क्लिक इवेंट उठाया जाता है तो मैं स्वचालित रूप से 'प्रदर्शन' टैब चुनता हूं।

सहायता के लिए धन्यवाद।

उत्तर

5

फिलिप श्मिड की पोस्ट पर विस्तार करने के लिए, मैं एक छोटे से डेमो ऊपर मार पड़ी है। आपको UIAutomationClient और UIAutomationTypes पर संदर्भ जोड़ने की आवश्यकता है।

एक संभावित सुधार (या मैं, यदि आप चाहें) प्रारंभ में विंडो को छिपाना है, केवल सही टैब के बाद इसे दिखा रहा है। मुझे यकीन नहीं है कि यह काम करेगा, हालांकि, मुझे यकीन नहीं है कि AutomationElement.FromHandle एक छिपी हुई विंडो ढूंढ पाएगा।

संपादित करें: कम से कम अपने कंप्यूटर पर (विंडोज 7, 32 बिट, .NET Framework 4.0), निम्नलिखित कोड शुरू में एक छिपे हुए कार्य प्रबंधक बनाता है और बाद सही टैब चयनित किया गया है यह पता चलता है। मैं प्रदर्शन टैब का चयन करने के बाद विंडो को स्पष्ट रूप से नहीं दिखाता, इसलिए शायद ऑटोमेशन लाइनों में से एक साइड-इफेक्ट के रूप में करता है।

using System; 
using System.Diagnostics; 
using System.Windows.Automation; 

namespace ConsoleApplication2 { 
    class Program { 
     static void Main(string[] args) { 
      // Kill existing instances 
      foreach (Process pOld in Process.GetProcessesByName("taskmgr")) { 
       pOld.Kill(); 
      } 

      // Create a new instance 
      Process p = new Process(); 
      p.StartInfo.FileName = "taskmgr"; 
      p.StartInfo.CreateNoWindow = true; 
      p.Start(); 

      Console.WriteLine("Waiting for handle..."); 

      while (p.MainWindowHandle == IntPtr.Zero) ; 

      AutomationElement aeDesktop = AutomationElement.RootElement; 
      AutomationElement aeForm = AutomationElement.FromHandle(p.MainWindowHandle); 
      Console.WriteLine("Got handle"); 

      // Get the tabs control 
      AutomationElement aeTabs = aeForm.FindFirst(TreeScope.Children, 
    new PropertyCondition(AutomationElement.ControlTypeProperty, 
    ControlType.Tab)); 

      // Get a collection of tab pages 
      AutomationElementCollection aeTabItems = aeTabs.FindAll(TreeScope.Descendants, new PropertyCondition(AutomationElement.ControlTypeProperty, 
    ControlType.TabItem)); 

      // Set focus to the performance tab 
      AutomationElement aePerformanceTab = aeTabItems[3]; 
      aePerformanceTab.SetFocus(); 
     } 
    } 
} 

मैं कार्य प्रबंधक के पिछले उदाहरणों क्यों नष्ट करते हैं? जब कोई उदाहरण पहले से खुला होता है, तो द्वितीयक उदाहरण खुल जाएंगे लेकिन तुरंत बंद हो जाएंगे। मेरा कोड इस के लिए जांच नहीं करता है, इसलिए विंडो संभाल पाता है जो कोड फ्रीज हो जाएगा।

+0

में रजिस्ट्री के माध्यम से अंतिम सक्रिय टैब को बदलने के लिए त्वरित समाधान के लिए धन्यवाद होगा। यह जानकर कि यह 'तकनीकी रूप से' किया जा सकता है, मैं स्वचालन में थोड़ा और अधिक देखूंगा और देख सकता हूं कि मैं क्या कर सकता हूं। –

+0

खुशी है कि मैं मदद कर सकता हूं। उपर्युक्त कोड उत्पादन के उपयोग के लिए उपयुक्त होना चाहिए, जब तक आप कुछ त्रुटि जांच जोड़ते हैं। आपके प्रश्न से पहले, मुझे वास्तव में इन प्रबंधित स्वचालन उपकरण के बारे में कोई जानकारी नहीं थी। तो, गलती से मुझे उनको परिचय देने के लिए धन्यवाद :) –

+0

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

1

दुर्भाग्यवश, taskmgr.exe किसी भी कमांड लाइन तर्क का समर्थन नहीं करता है।

रन करते समय, यह हमेशा उस टैब को सक्रिय करेगा जो अंतिम बंद पर सक्रिय था।

+6

+1 - एक बदसूरत हैक 'HKCU/Software/Microsoft/Windows NT/CurrentVersion/TaskManager' –

2

जबकि taskmgr.exe में चयनित टैब निर्दिष्ट करने के लिए कोई कमांड लाइन तर्क नहीं है, तो आप प्रदर्शन टैब पर 'नेविगेट' करने के लिए Windows UI Automation का उपयोग कर सकते हैं।

एक सांत्वना आवेदन के रूप में यह रन: