हां, यह संभव है। हालांकि चेतावनी दी जानी चाहिए: इसमें Win32 इंटरऑप का थोड़ा सा हिस्सा शामिल है (इसका मतलब है पी/प्रबंधित कोड से देशी डीएलएल में शामिल है), और केवल कुछ अनियंत्रित एपीआई के साथ करने योग्य है। हालांकि, केवल गैर-दस्तावेजी शामिल सुविधाओं खिड़की रंग योजना प्राप्त करने के लिए कर रहे हैं (या DWM यह कहता है के रूप में, खिड़की colorization रंग) है, जो इस दूसरे प्रश्न में कवर किया जाता है:
Vista/7: How to get glass color?
अपने ही परियोजना में, मैं 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 और उसके स्वचालित विंडो colorization की सुविधा के साथ महान काम करता है। जैसा कि ऊपर दिए गए लिंक में सुझाया गया है, आप पी/Invoke के विकल्प के रूप में रंग मानों के लिए रजिस्ट्री में देख सकते हैं, लेकिन मैंने उस विधि का परीक्षण नहीं किया है, और जैसा कि कहा गया है कि ये अनियंत्रित हैं और स्थिर होने की गारंटी नहीं है।
एक बार जब आप अपने ढाल ब्रश को चित्रित करने के लिए रंग प्राप्त कर लेते हैं, तो विंडो रंग योजना बदल जाती है, चाहे विंडोज़ द्वारा मैन्युअल रूप से या स्वचालित रूप से ब्रश अपडेट हो जाएंगे। शुक्र है, जब भी ऐसा होता है, तो विंडोज WM_DWMCOLORIZATIONCOLORCHANGED
window message प्रसारित करता है, इसलिए आपको बस उस संदेश को सुनने और अपने रंगों को अपडेट होने पर अपडेट करने की आवश्यकता होती है। आप विंडो प्रक्रिया (WndProc()
) पर हुक करके ऐसा करते हैं।
WM_DWMCOLORIZATIONCOLORCHANGED
का मान 0x320
है; आप इसे कहीं स्थिर के रूप में परिभाषित करना चाहते हैं ताकि आप इसे कोड में उपयोग कर सकें।
इसके अलावा, WinForms के विपरीत, डब्ल्यूपीएफ विंडोज़ में वर्चुअल WndProc()
विधि ओवरराइड करने की विधि नहीं है, इसलिए आपको एक प्रतिनिधि के रूप में अपने संबंधित विंडो हैंडल (एचडब्ल्यूएनडी) में एक प्रतिनिधि के रूप में बनाना और हुक करना होगा।
मेरा इन उत्तरों से कुछ उदाहरण कोड ले रहा है:
हम:
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;
}
}
विंडोज रंग बदलने के संक्रमण के दौरान, WM_DWMCOLORIZATIONCOLORCHANGED
है प्रत्येक keyframe पर प्रेषित संक्रमण में, इसलिए आप रंग परिवर्तन के दौरान एक छोटे विस्फोट पर कई संदेश प्राप्त करेंगे। यह सामान्य बात है; बस अपने ग्रेडिएंट ब्रश को सामान्य रूप से अपडेट करें और आपको पता चलेगा कि जब विंडोज़ विंडो रंग योजना को बदलता है, तो आपके ग्रेडियेंट भी खिड़की के फ्रेम के साथ आसानी से संक्रमण करेंगे।
याद रखें कि आप स्थितियों में, जहां DWM उपलब्ध नहीं है, जैसे कि जब Windows XP पर चल रहा है, या Windows Vista पर चल रहा है या बाद में डेस्कटॉप संरचना के साथ अक्षम के रूप में के लिए खाते की आवश्यकता हो सकती है। आप यह भी सुनिश्चित करना चाहते हैं कि आप इसका अधिक उपयोग न करें, या आप एक महत्वपूर्ण प्रदर्शन हिट कर सकते हैं और अपने ऐप को धीमा कर सकते हैं।
इसमें काफी इंटरऑप शामिल है और केवल कुछ * अनियंत्रित एपीआई * के साथ ही करने योग्य है। असल में, मैंने इसे विंडोज विस्टा/7 के लिए अपनी परियोजना के साथ किया है, और इसे विंडोज 8 पर सफलतापूर्वक परीक्षण किया है। मैं उस पर आधारित एक जवाब देने की कोशिश कर सकता हूं, लेकिन मुझे थोड़ी देर की आवश्यकता होगी। यह भी देखें: [Vista/7: कांच रंग प्राप्त करने के लिए कैसे?] (http://stackoverflow.com/questions/3560890/vista-7-how-to-get-glass-color) – BoltClock
आप जानकारी के लिए बहुत बहुत धन्यवाद । मैंने रजिस्ट्री चाल का उपयोग किया और यह बहुत अच्छा काम करता है। – user1868880