2012-05-11 10 views
5

मैं सिस्टम ट्रे में एक आइकन और फिर इसे एक वैश्विक कीबोर्ड शॉर्टकट एक समारोह बाहर ले जाने के देने के लिए कोशिश कर रहा हूँ।अदृश्य रूपों (ग #) के साथ काम नहीं कर रहा RegisterHotKey

मैं RegisterHotKey उपयोग कर रहा हूँ वैश्विक कीबोर्ड शॉर्टकट सेट करने के लिए, और यह काम करता है, तो मुख्य आइकन के साथ जुड़े प्रपत्र दिख रहा है। लेकिन अगर फॉर्म अदृश्य है तो WndProc विधि कभी नहीं आती है।

कोई विचार?

संपादित करें:

protected override void OnLoad(EventArgs e) 
{ 
    hotKey = new GlobalHotkey(GlobalHotkey.WIN, Keys.T, this); 
    bool registered = hotKey.Register(); 
    Visible = false; 
    ShowInTaskbar = false; 
    base.OnLoad(e); 
} 

"पंजीकृत" के रूप में "सही" दिखा रहा है, और शॉर्टकट कुंजी काम करता है ठीक है अगर मैं: क्या मैं "छिपा" से मतलब है कि निम्नलिखित मुख्य रूप में जोड़ा जाता है "दृश्यमान = झूठा;" छोड़ दें और "ShowInTaskbar = false;"।

+2

क्या आप अपनी कोशिश की गई कोड का नमूना दिखा सकते हैं? – ImGreg

+0

हां, अपना कोड दिखाएं क्योंकि यदि रजिस्टरहॉटकी एचडब्ल्यूएनडी पैरामीटर अदृश्य है तो कोई फर्क नहीं पड़ता है, संदेश अभी भी संसाधित किए गए हैं –

+0

आप विंडो बनने से पहले हॉटकी पंजीकृत नहीं कर पाएंगे। क्या आपका मतलब "दृश्यमान" से है? –

उत्तर

4

Winforms Winapi में एक सुंदर draconian प्रतिबंध के आसपास काम करता है। खिड़की के कुछ गुण केवल तभी निर्दिष्ट किए जा सकते हैं जब खिड़की बनाई जाती है और बाद में बदला नहीं जा सकता है। या दूसरे शब्दों में, वे देशी CreateWindowEx() कॉल में निर्दिष्ट हैं।

यह CreateWindowEx() को फिर से कॉल करके इसके आसपास काम करता है। या दूसरे शब्दों में, मौजूदा विंडो को नष्ट करें और इसे फिर से बनाएं। यह एक निफ्टी चाल है लेकिन इसका कुछ साइड इफेक्ट्स हैं। उदाहरण के लिए जब आप नई खिड़की खुद को चित्रित करते हैं तो आप झिलमिलाहट का एक छोटा सा हिस्सा देख सकते हैं। उदाहरण के लिए एक वृक्ष दृश्य कुछ बड़े साइड इफेक्ट्स दिखाई दे रहे हैं। जब यह पुन: उत्पन्न हो जाता है तो सभी नोड्स पतन हो जाते हैं। मुश्किल से बचने के लिए, मूल खिड़की से जुड़े बहुत अधिक राज्य हैं। एक फॉर्म के लिए, ShowInTaskbar संपत्ति ऐसी एक संपत्ति है। लेकिन राइट टॉफ्ट, फॉर्मबॉर्डर स्टाइल, कंट्रोलबॉक्स, इत्यादि।

सबसे प्रासंगिक दुष्प्रभाव वह है जिसे आप चला रहे हैं। खिड़की को दोबारा बनाना हमेशा अनिवार्य रूप से संभाल संपत्ति को बदल देता है। और जब आप RegisterHotKey(), या इसका उपयोग करने वाली लाइब्रेरी का उपयोग करते हैं तो यह गलत हो जाता है, कि Winapi कॉल विंडो हैंडल का उपयोग करता है। तो जब Winforms उस खिड़की को नष्ट कर देता है तो कभी भी कॉलबैक नहीं होगा।

यह ठीक करना आसान है, आप केवल गलत ईवेंट हैंडलर का उपयोग कर रहे हैं। इसके बजाए OnHandleCreated विधि के लिए ओवरराइड में कॉल करें। यह फिर से चलाता है जब खिड़की फिर से बनाई जाती है। फिर भी एक और आसान फिक्स, लेकिन लगभग विश्वसनीय नहीं है, केवल कन्स्ट्रक्टर में ShowInTaskbar जैसे गुण सेट करना है।

4

समस्या है झूठे परिवर्तन करने के लिए ShowInTaskbar खिड़की संभाल, जिसका अर्थ है कि hwnd RegisterHotkey के लिए पारित अब वैध नहीं है की स्थापना कि।

सेटिंग के बाद हॉटकी को पंजीकृत करना ShowInTaskBar ठीक काम करता है।

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