2010-02-02 16 views
16

मैं एक सी # एप्लिकेशन बनाना चाहता हूं जो कि वर्तमान में किस एप्लिकेशन के फ़ोकस के अनुसार सामग्री बदलता है। तो यदि उपयोगकर्ता फ़ायरफ़ॉक्स का उपयोग कर रहा है, तो मेरा ऐप उसे जानता होगा। क्रोम, विजुअल स्टूडियो, TweetDeck आदि के लिए समानसी #: यह पता लगाने के लिए कि किस एप्लिकेशन पर ध्यान केंद्रित किया गया है

क्या यह संभव है, और यदि ऐसा है - तो मैं इसे प्राप्त करने के बारे में कैसे जाऊं?

मुझे लगता है कि मैं बहुत कुछ मांग रहा हूं - लेकिन यह एक कोशिश के लायक है।

अग्रिम में बहुत धन्यवाद।

+0

पहुंच इंटरफेस का प्रयोग करें। यह वही चीज है जो वे हैं। –

+0

इस प्रश्न का स्वीकार्य उत्तर @ रेमंड चेन की टिप्पणी पर विस्तारित है: http://stackoverflow.com/questions/11711400/how-to-monitor-focus-changes – John

उत्तर

7

Application.AddMessageFilter पर एक नज़र डालें, और WM_ACTIVATEAPP संदेशों को देखें, जो आपको बताएंगे कि कोई ऐप सक्रिय होने पर आपको बताएगा, यानी फोकस प्राप्त होता है।

+6

'एप्लिकेशन। AddMessageFilter' केवल मौजूदा प्रक्रियाओं के लिए संदेशों को रोकता है, न कि अन्य प्रक्रियाओं के लिए। – larsmoa

4

Grrr। जैसा कि अक्सर होता है, मैंने इस प्रश्न को पोस्ट करने से पहले कुछ समय गुगलिंग बिताई।

एक बार जब मैंने अंततः प्रश्न पोस्ट किया, तो मेरी अगली Google खोज ने जवाब का खुलासा किया।

मैंने अभी तक इसका परीक्षण नहीं किया है, लेकिन ऐसा लगता है कि GetForegroundWindow() कुंजी है। मैं बर्बाद किया है किसी के समय के लिए

http://www.csharphelp.com/2006/08/get-current-window-handle-and-caption-with-windows-api-in-c/

Appologies एक Googalable जवाब पूछकर (?):

बजाय मुझे पुनर्लेखन क्या पहले से ही लिखा है, यहाँ पेज कि जानकारी प्रदान की के लिए एक लिंक है।

+1

AddMessageFilter का शुद्ध रूप से प्रबंधित कोड होने का लाभ है, GetForegroundWindows कम "भारी है "(जब आप आवश्यकता हो तो अग्रभूमि विंडो की जांच करें, प्रत्येक एप्लिकेशन परिवर्तन के लिए अधिसूचित होने की बजाय) लेकिन PInvoke की आवश्यकता है। आपको केवल अभी चुनना है;) – munissor

7

यह Automation framework का उपयोग कर शुद्ध .NET में किया जा सकता है जो WPF का हिस्सा है। उदाहरण के लिए: UIAutomationClient और UIAutomationTypes के लिए संदर्भ जोड़ें और Automation.AddAutomationFocusChangedEventHandler उपयोग करते हैं, .:

public class FocusMonitor 
{ 
    public FocusMonitor() 
    { 
     AutomationFocusChangedEventHandler focusHandler = OnFocusChanged; 
     Automation.AddAutomationFocusChangedEventHandler(focusHandler); 
    } 

    private void OnFocusChanged(object sender, AutomationFocusChangedEventArgs e) 
    { 
     AutomationElement focusedElement = sender as AutomationElement; 
     if (focusedElement != null) 
     { 
      int processId = focusedElement.Current.ProcessId; 
      using (Process process = Process.GetProcessById(processId)) 
      { 
       Debug.WriteLine(process.ProcessName); 
      } 
     } 
    } 
} 
संबंधित मुद्दे

 संबंधित मुद्दे