.NET में आप वर्तमान विंडो हैंडल काउंट और विंडो हैंडल सीमा कैसे प्राप्त कर सकते हैं?




window handle (3)

मैं खिड़की के हैंडल की मौजूदा संख्या और सी # में सिस्टम-चौड़ा विंडो हैंडल सीमा प्राप्त करना चाहता हूँ। यह कैसे करना है?


जैसा कि रेमंड चेन कुछ समय पहले लगा था, अगर आप विंडो हैंडल सीमा के बारे में सोच रहे हैं, तो आप शायद कुछ गलत कर रहे हैं :)

वैसे भी, मुझे यकीन है कि ऐसा करने के लिए कोई विशेष C # रास्ता नहीं है, क्योंकि यह बहुत सिस्टम-विशिष्ट है आप उसी फ़ंक्शन का उपयोग कर सकते हैं जो आप C ++ एप्लिकेशन में उपयोग करेंगे। P / Invoke का उपयोग कर कार्यों को बुलाओ आयात कैसे लिखने के लिए, pinvoke.net पर जाएं

संपादित करें: जैसा कि मैं आपके प्रश्न को समझता हूं, मुझे लगता है कि आपको पहले से ही पता है कि इसे Win32 अनुप्रयोग में कैसे करना है।


यदि आप रेमंड चेन के पोस्ट पढ़ते हैं, तो संभवतः आपको ऐसा कष्टप्रद लगता होगा जितना मैंने किया था। आप केवल "शायद कुछ गलत कर रहे हैं" क्योंकि आप कुछ कर रहे हैं Windows सक्षम नहीं है

मेरे आवेदन में, पहली बार कोई उपयोगकर्ता टैब पृष्ठ पर जाता है, तो मैं उस पृष्ठ पर सभी नियंत्रणों को बना और रखता हूं। यह एक ध्यान देने योग्य राशि का समय लेता है - एक पृष्ठ पर आसानी से 50 नियंत्रण हो सकते हैं। इसलिए मैं इसे टैबलेट पर टैब के ऊपर नियंत्रण को त्याग नहीं कर सकता, अगर यह संभव हो, और उपयोगकर्ता तक टैब पृष्ठ के सेट को बंद कर दें।

ऐसा होने पर, कुछ उपयोगकर्ता कभी भी टैब पृष्ठों के किसी भी सेट को बंद नहीं करना चाहते। मुझे उन्हें मजबूर क्यों करना चाहिए? मेरे यूआई के साथ, वे लेनदेन के 300+ सेटों में से किसी एक को जल्दी से नेविगेट कर सकते हैं, जो प्रबंधन के लिए जिम्मेदार हैं। उनकी मशीनें बहुत तेज़ हैं, और इन्हें बहुत ही संवेदनशील बनाने के लिए पर्याप्त मेमोरी है। केवल समस्या यह है कि विंडोज इसे समर्थन नहीं कर सकता।

मैं नियंत्रण का उपयोग कर रहा हूं, और कुछ अन्य UI तकनीक क्यों नहीं? क्योंकि वे काम करते हैं मुझे फ़ोकस इवेंट, टैब ऑर्डर, वैधीकरण इवेंट, डायनेमिक लेआउट, और डाटा बाइंडिंग का समर्थन करने की ज़रूरत है - उपयोगकर्ता इन-मेमोरी डाटासेट में दर्जनों टेबलों में वास्तव में हजारों रिकॉर्ड रिकॉर्ड कर रहे हैं। विकास की मात्रा मुझे करना होगा - कहते हैं - खिड़की नियंत्रण का उपयोग कर कुछ लागू करना खगोलीय है

मैं केवल "यह गलत कर रहा हूँ" क्योंकि खिड़कियों की संख्या पर Windows की हार्ड सीमा होती है जो इसे समर्थन कर सकती है। यह कठिन सीमा एक दशक की पुरानी मान्यताओं के एक समूह पर आधारित है कि कंप्यूटर का UI कैसे बनाया जा सकता है यह मुझे नहीं है जो "कुछ गलत कर रहा है।"

किसी भी दर पर, इसका मेरा समाधान दो भागों में है

सबसे पहले, एक क्लास जो आपको बता सकता है कि आपकी प्रक्रिया का प्रबंधन कितने खिड़की करता है:

using System;
using System.Runtime.InteropServices;

namespace StreamWrite.Proceedings.Client
{
    public class HWndCounter
    {
        [DllImport("kernel32.dll")]
        private static extern IntPtr GetCurrentProcess();

        [DllImport("user32.dll")]
        private static extern uint GetGuiResources(IntPtr hProcess, uint uiFlags);

        private enum ResourceType
        {
            Gdi = 0,
            User = 1
        }

        public static int GetWindowHandlesForCurrentProcess(IntPtr hWnd)
        {
            IntPtr processHandle = GetCurrentProcess();
            uint gdiObjects = GetGuiResources(processHandle, (uint)ResourceType.Gdi);
            uint userObjects = GetGuiResources(processHandle, (uint)ResourceType.User);

            return Convert.ToInt32(gdiObjects + userObjects);
        }
    }
}

दूसरा, मैं अपने टैब पृष्ठ ऑब्जेक्ट के कम से कम हाल ही में उपयोग किए गए कैश को बनाए रखता हूं। .NET ढांचा एक सामान्य एलआरयू कैश वर्ग प्रदान नहीं करता है, इसलिए मैंने एक बनाया, जिसे आप यहां प्राप्त कर सकते हैं यदि आपको एक की आवश्यकता है हर बार उपयोगकर्ता टैब पृष्ठ पर जाता है, मैं इसे एलआरयू कैश में जोड़ देता हूं। तब मैं यह देखने के लिए जांचता हूं कि क्या मैं खिड़की के हैंडल पर कम चल रहा हूं। अगर मैं हूं, तो मैं कम से कम-हाल ही में उपयोग किए गए टैब पृष्ठ पर नियंत्रणों को फेंक कर रखता हूं, और तब तक ऐसा कर रहा हूं जब तक मेरे पास पर्याप्त विंडो फिर से संभालती नहीं है।






handle