2008-09-26 18 views
5

मुझे सभी चल रहे अनुप्रयोगों की गणना करने की आवश्यकता है। विशेष रूप से, सभी शीर्ष खिड़कियां। और हर खिड़की के लिए मुझे उस विंडो के सिस्टम मेनू में अपना कस्टम आइटम जोड़ना होगा।सी ++ में सिस्टम मेनू में कस्टम आइटम कैसे जोड़ें?

मैं इसे C++ में कैसे पूरा कर सकता हूं?

अद्यतन।

मुझे विंडोज, मैकोज़ और उबंटू के लिए समाधान करने में खुशी होगी (हालांकि, मुझे यकीन नहीं है कि मैकोज़ और उबंटू के पास 'सिस्टम मेनू' जैसी चीज है)।

+0

लक्ष्य ओएस - विंडोज क्या है? –

उत्तर

1

एक बार जब आप किसी अन्य विंडो की शीर्ष स्तर की संभाल है, तो आप विंडो के सिस्टम मेनू को पुनः प्राप्त करने GetMenu() फोन और फिर इसे संशोधित करने, उदाहरण के लिए करने में सक्षम हो सकता है:

HMENU hMenu = GetMenu(hwndNext); 
+0

मुझे लगता है कि आप GetSystemMenu का मतलब है, GetMenu नहीं; मेरा जवाब देखें – efotinis

0

आप EnumWindows() उपयोग कर सकते हैं शीर्ष स्तर विंडोज की गणना करने में।

मेरे पास आपके प्रश्न के दूसरे भाग के लिए कोई विशिष्ट उत्तर नहीं है, लेकिन यदि आप विंडो को उप-वर्ग करते हैं, तो मुझे लगता है कि आप सिस्टम मेनू को संशोधित कर सकते हैं।

संपादित करें: या ऐसा क्या क्रिस ने कहा, फोन GetMenu()

0

पुन: अद्यतन - कृपया ध्यान दें कि नहीं भी माइक्रोसॉफ्ट विंडोज की आवश्यकता है खिड़कियों एक sytem मेनू है। GetMenu() 0 लौटा सकता है। आपको विंडो निर्माण को भी अवरुद्ध करने की आवश्यकता होगी, क्योंकि प्रत्येक नई शीर्ष विंडो को संभवतः इसकी भी आवश्यकता होती है।

इसके अलावा, जो भी आप प्रस्तावित करते हैं वह अन्य अनुप्रयोगों के लिए घुसपैठ कर रहा है। आप यह सुनिश्चित करने के लिए कैसे जा रहे हैं कि जब आप अपने मेनू को संशोधित करते हैं तो वे तोड़ते नहीं हैं? और आप यह सुनिश्चित करने के लिए कैसे जा रहे हैं कि आप संदेश दबाएं? विशेष रूप से, आप कैसे सुनिश्चित करेंगे कि आप उन्हें किसी और को देख सकें इससे पहले कि आप उन्हें रोक दें? रेमंड चेन को उद्धृत करने के लिए, कल्पना करें कि क्या होता है यदि दो कार्यक्रम इसका प्रयास करेंगे।

HWND wnd = GetWindow(GetDesktopWindow(), GW_CHILD); 
while (wnd) { 
    // handle 'wnd' here 
    // ... 
    wnd = GetNextWindow(wnd, GW_HWNDNEXT); 
} 

के लिए के रूप में:

8

Windows के लिए, एक और तरीका है उच्च-स्तरीय खिड़कियों प्राप्त करने के लिए (EnumWindows के अलावा, जो एक कॉलबैक का उपयोग करता है) डेस्कटॉप के पहले बच्चे हो जाते हैं और उसके बाद अपने सभी भाई-बहनों को पुनः प्राप्त करने के लिए है सिस्टम मेनू प्राप्त करने के बाद, GetSystemMenu फ़ंक्शन का उपयोग करें, FALSE के साथ दूसरे तर्क के रूप में। अन्य उत्तरों में उल्लिखित GetMenuसामान्य विंडो मेनू देता है।

नोट, हालांकि, एक विदेशी प्रक्रिया की विंडो में एक कस्टम मेनू आइटम जोड़ने के दौरान, उस आइटम के चयन का जवाब देना थोड़ा मुश्किल है। WM_SYSCOMMAND संदेशों की निगरानी के लिए आपको या तो विंडो को उपclass करने में सक्षम होने के लिए प्रक्रिया को कुछ कोड इंजेक्ट करना होगा, या वैश्विक हुक (शायद WH_GETMESSAGE या WH_CBT प्रकार) स्थापित करना होगा।

+0

आपके उत्तर ने अभी अपना दिन बनाया है (वास्तव में रात)! मैंने WH_CBT के बारे में कभी नहीं पढ़ा और अपनी पोस्ट देखने के बाद, अब मैं सफलतापूर्वक (इंजेक्शन कोड के माध्यम से) WM_SYSCOMMAND को दूसरी प्रक्रिया से रोक सकता हूं। – foxx1337

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