दिलचस्प पोस्ट
Windows पर एनाकोंडा पायथन में कैरास और थेनो को कैसे स्थापित कर सकता हूं? क्या प्रमुख एसक्यूएल डाटाबेस में वापस बनाने के लिए संभव है? एनवीडिया 304.125 के लिए क्यूडा का संस्करण क्या है सी – फ्लोटिंग प्वाइंट नंबर का क्रमबद्धकरण (फ्लोट्स, डबल्स) निर्देशों को कैसे इंस्टाटिव करना और प्रोग्राम को लागू करना है? बिट्स की गिनती या सही खोजने के लिए कुशल बिटवार कार्यवाहीएं | Chrome, सफ़ारी तालिका में अधिकतम-चौड़ाई की अनदेखी करते हैं क्या नया क्लैंग ऑब्जेक्टिव-सी लिटलल्स को कस्टम क्लासेस पर पुनर्निर्देशित किया जा सकता है? ओपनसीवी को एक पायथन वर्लेवीन से चलाना एक ही नाम के साथ मॉड्यूल मौजूद होने पर निर्मित लाइब्रेरी से आयात करना एंड्रॉइड स्टूडियो त्वरित दस्तावेज हमेशा "प्रलेखन प्रलेखन" जेएसएफ में <! DOCTYPE> अनुभाग कैसे दिखाना चाहिए? HTML5 या एक्सएचटीएमएल? एंड्रॉइड में फोन कॉल कैसे रिकॉर्ड करें? फ्लोट से परिवर्तन करने से मूल्य में परिवर्तन क्यों हो सकता है? नया Symfony 3 निर्देशिका संरचना क्या है?

विंडोज 8 की स्वचालित रंग थीम का सक्रिय रंग प्राप्त करें

विंडोज 8 में, मैंने कलर स्कीम को स्वचालित करने के लिए सेट किया है और एक्स मिनट के बाद बदलने के लिए मेरे वॉलपेपर को कॉन्फ़िगर किया है। सक्रिय योजना के अनुसार रंग योजना बदलती है।

मैं एक WPF अनुप्रयोग विकसित कर रहा हूं और जब मेरे वर्तमान संस्करण से मिलान करने के लिए रंगीन रंग बदलता है तो मेरे ग्रेडियंट्स को बदलना चाहेंगे।

क्या वर्तमान / वास्तविक रंग योजना प्राप्त करने के लिए और सी # में परिवर्तन के बारे में सूचित किया जा सकता है?

Solutions Collecting From Web of "विंडोज 8 की स्वचालित रंग थीम का सक्रिय रंग प्राप्त करें"

हाँ, यह मुमकिन है। हालांकि चेतावनी दी गई: यह Win32 interop के काफी कुछ शामिल है (इसका मतलब है पी / प्रबंधित कोड से मूल DLLs में शामिल होता है), और कुछ निश्चित दस्तावेजों के साथ ही संभव है । हालांकि, इसमें शामिल एकमात्र अनुपयुक्त सुविधाओं में विंडो रंग योजना प्राप्त करने के लिए (या डीडब्ल्यूएम के रूप में इसे कहते हैं, विंडो रंगीकरण रंग), जो इस अन्य प्रश्न में शामिल है:

Vista / 7: ग्लास रंग कैसे प्राप्त करें?

मेरी अपनी प्रोजेक्ट में, मैं कॉल करने के लिए DwmGetColorizationParameters() का उपयोग करता हूं:

 internal static class NativeMethods { [DllImport("dwmapi.dll", EntryPoint="#127")] internal static extern void DwmGetColorizationParameters(ref DWMCOLORIZATIONPARAMS params); } public struct DWMCOLORIZATIONPARAMS { public uint ColorizationColor, ColorizationAfterglow, ColorizationColorBalance, ColorizationAfterglowBalance, ColorizationBlurBalance, ColorizationGlassReflectionIntensity, ColorizationOpaqueBlend; } 

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

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

WM_DWMCOLORIZATIONCOLORCHANGED का मान WM_DWMCOLORIZATIONCOLORCHANGED है; आप इसे किसी अन्य स्थान के रूप में परिभाषित करना चाहते हैं ताकि आप इसे कोड में उपयोग कर सकें।

इसके अलावा, WinForms के विपरीत, WPF विंडो में ओवरराइड करने के लिए एक आभासी WndProc() विधि नहीं है, इसलिए आपको अपने संबद्ध विंडो हैंडल (एचडब्ल्यूएनडीएस) के प्रतिनिधि के रूप में एक को बनाने और एक को हुक करनी है।

मेरे इन उत्तरों के कुछ उदाहरण कोड लेना:

  • मैं विस्तारित विंडो फ्रेम को खींचकर एक WPF विंडो को कैसे चल सकता हूं?
  • WPF में सिस्टम थीम परिवर्तन का पता लगाएं

हमारे पास है:

 const int WM_DWMCOLORIZATIONCOLORCHANGED = 0x320; private IntPtr hwnd; private HwndSource hsource; private void Window_SourceInitialized(object sender, EventArgs e) { if ((hwnd = new WindowInteropHelper(this).Handle) == IntPtr.Zero) { throw new InvalidOperationException("Could not get window handle."); } hsource = HwndSource.FromHwnd(hwnd); hsource.AddHook(WndProc); } private static Color GetWindowColorizationColor(bool opaque) { var params = NativeMethods.DwmGetColorizationParameters(); return Color.FromArgb( (byte)(opaque ? 255 : params.ColorizationColor >> 24), (byte)(params.ColorizationColor >> 16), (byte)(params.ColorizationColor >> 8), (byte) params.ColorizationColor ); } private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) { switch (msg) { case WM_DWMCOLORIZATIONCOLORCHANGED: /* * Update gradient brushes with new color information from * NativeMethods.DwmGetColorizationParams() or the registry. */ return IntPtr.Zero; default: return IntPtr.Zero; } } 

जब Windows रंग परिवर्तन को WM_DWMCOLORIZATIONCOLORCHANGED है, तो WM_DWMCOLORIZATIONCOLORCHANGED को संक्रमण में हर WM_DWMCOLORIZATIONCOLORCHANGED में भेजा जाता है, इसलिए आपको रंग परिवर्तन के दौरान कम फट पर कई संदेश प्राप्त होंगे। यह सामान्य बात है; बस अपने ढाल ब्रश को सामान्य रूप से अपडेट करें और आप देखेंगे कि जब विंडोज़ विंडो रंग योजना को संक्रमित करती है, तो आपके ग्रेडिएंट बाकी सभी विंडो फ़्रेमों के साथ आसानी से संक्रमण होंगे।

याद रखें कि आपको ऐसे परिस्थितियों के लिए खाता होना चाहिए जहां DWM उपलब्ध नहीं है, जैसे कि Windows XP पर चलते समय, या Windows Vista पर चलते समय या बाद में अक्षम डेस्कटॉप संरचना के साथ। आप यह भी सुनिश्चित करना चाहेंगे कि आप इसका अति प्रयोग न करें, या आपको एक महत्वपूर्ण प्रदर्शन हिट हो सकता है और आपका ऐप धीमा कर सकता है।

यह पी। / बिना उपयोग किए बिना .NET 4.5 और बाद में किया जा सकता है। सिस्टम पैरामीटर वर्ग में अब स्टैटिकप्रॉपर्टी – चेंजेड इवेंट के साथ स्टैटिक विंडोग्लैसब्रश और विंडोग्लस कॉइलर प्रॉपर्टी मौजूद है ।

एक्सएएमएल से, आप WindowGlassBrush संपत्ति को इस तरह से बाँध सकते हैं:

 <Grid Background="{x:Static SystemParameters.WindowGlassBrush}"> 

हालांकि, इस असाइनमेंट के साथ जब पृष्ठभूमि में रंग बदलता है, तो पृष्ठभूमि का रंग स्वचालित रूप से अपडेट नहीं होगा। दुर्भाग्य से, SystemParameters विंडोग्लैशब्रुशकी या विंडोग्लैसकोलर की प्रॉपर्टी को डायनेमिक रिसोर्स के साथ संसाधनों के रूप में उपयोग करने के लिए नहीं प्रदान करता है, इसलिए परिवर्तन सूचनाओं को प्राप्त करने के लिए StaticPropertyChanged ईवेंट को संभालने के लिए पीछे कोड की आवश्यकता होती है।

 public partial class MainWindow : Window { public MainWindow() { this.InitializeComponent(); SystemParameters.StaticPropertyChanged += this.SystemParameters_StaticPropertyChanged; // Call this if you haven't set Background in XAML. this.SetBackgroundColor(); } protected override void OnClosed(EventArgs e) { SystemParameters.StaticPropertyChanged -= this.SystemParameters_StaticPropertyChanged; base.OnClosed(e); } private void SetBackgroundColor() { this.Background = SystemParameters.WindowGlassBrush; } private void SystemParameters_StaticPropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) { if (e.PropertyName == "WindowGlassBrush") { this.SetBackgroundColor(); } } }