मुख्य समस्या यह है कि यह टूल विंडो पर निर्भर करता है, क्योंकि विजुअल स्टूडियो वास्तव में उपकरण विंडो को वास्तव में प्रस्तुत करने के बारे में बहुत कुछ नहीं जरूरी है।
यदि टूल विंडो में एचएनडब्ल्यूडी खेलने के लिए है, तो आप SetLayeredWindowAttributes फ़ंक्शन का उपयोग करके पारदर्शिता सेट कर सकते हैं। यदि उपकरण विंडो WPF है, तो आप अन्य चाल का उपयोग कर सकते हैं।
अब समस्या कुछ उपयोगी पर पकड़ प्राप्त करना है ... बस विजुअल स्टूडियो 2010 पर SPY ++ लॉन्च करें और आप देखेंगे कि एचडब्ल्यूएनडी के आसपास कई दिखाई नहीं दे रहे हैं। कुछ पैकेज अप्रबंधित कोड का उपयोग करते हैं, कुछ संकुल .NET + Winforms का उपयोग करते हैं, और अधिक से अधिक, हाल के पैकेज .NET + WPF का उपयोग करते हैं।
UISpy (एक और जासूस उपकरण, लेकिन UI Automation के आधार पर) सभी टूल विण्डो देखता है, लेकिन यह किसी भी मूल निवासी खिड़की हैंडल (मानक संपत्ति है कि यूआई स्वचालन पढ़ सकते हैं में से एक), जो अच्छी खबर नहीं है नहीं दिखाती है।
विजुअल स्टूडियो मेजबान विंडो बनाने के लिए IVsWindowPane इंटरफ़ेस और विशेष रूप से CreatePaneWindow विधि का उपयोग करता है, लेकिन किसी भी HWND हैंडल को वापस खेलने के लिए कुछ भी अधिकारी नहीं है।
हम्म! यदि आपके पास एक विशिष्ट टूल विंडो है जिसे आप ट्विक करना चाहते हैं, तो हम एक गहरी नजर डाल सकते हैं, लेकिन मुझे लगता है कि 100% जेनेरिक टूल लिखना मुश्किल है।
EDIT: मैंने और अधिक खोज की है।
// WindowFrame needs Microsoft.VisualStudio.Platform.WindowManagement.dll
public static IEnumerable<WindowFrame> EnumWindowFrames(Microsoft.VisualStudio.OLE.Interop.IServiceProvider sp, __WindowFrameTypeFlags frameTypes)
{
if (sp == null)
throw new ArgumentNullException("sp");
ServiceProvider serviceProvider = new ServiceProvider(sp);
IVsUIShell4 shell = (IVsUIShell4)serviceProvider.GetService(typeof(SVsUIShell)); // VS 2010 only
IEnumWindowFrames framesEnum;
IVsWindowFrame[] frames = new IVsWindowFrame[1];
uint numFrames;
shell.GetWindowEnum((uint)frameTypes, out framesEnum);
if (framesEnum == null)
yield break;
while ((framesEnum.Next(1, frames, out numFrames) == VSConstants.S_OK) && (numFrames == 1))
{
WindowFrame frame = frames[0] as WindowFrame;
if (frame != null)
yield return frame;
}
}
यह WindowFrame की कई घटनाओं के दे देंगे: यह एक कोड है कि सभी खिड़कियां वर्तमान दृश्य स्टूडियो उदाहरण के फ्रेम (डॉक होने पर या अस्थायी) विश्लेषण करता है। विंडोफ्रेम को दस्तावेज नहीं किया गया है लेकिन यह सार्वजनिक है (माइक्रोसॉफ्ट में स्थित है। VisualStudio.Platform.WindowManagement.dll), ताकि आप इसके साथ खेल सकें। प्रत्येक विंडोफ्रेम उदाहरण में एक फ्रेम व्यू प्रॉपर्टी होती है जिसमें सामग्री प्रॉपर्टी होती है। यह सामग्री प्रॉपर्टी, मेरे निष्कर्षों से अधिकांश समय, एक डब्ल्यूपीएफ पैनल तत्व है। उस पैनल के नीचे पदानुक्रम तब निर्भर करेगा कि विंडो वास्तव में कैसे कार्यान्वित की जाती है।
यदि यह एक अप्रबंधित या Winforms (उदाहरण, .SQL संपादक) है, तो पैनल के बच्चों के संग्रह में एक HwndHost होगा। मैंने इसके साथ खेलने की कोशिश की है (SetLayeredWindowAttributes का उपयोग करके), लेकिन यह काम नहीं कर रहा है ...
यदि यह एक डब्ल्यूपीएफ है (उदाहरण के लिए, ब्रांड नया सी #/वीबी संपादक), तो एक विशाल WPF hiearchy होगा, जो अंततः IWfpTextView कार्यान्वयन पर जायेगा। आप इस पदानुक्रम में कई चीजें बदल सकते हैं, और कुछ काम करेंगे (जैसे पृष्ठभूमि संपत्ति), लेकिन ... पारदर्शिता से संबंधित, मुझे नहीं लगता कि यह संभव है क्योंकि रूट विंडो इसे अनुमति नहीं देती है (इसमें AllowTransparency सेट है झूठ बोलने के लिए, और इसे प्रदर्शित होने के बाद इसे बदला नहीं जा सकता है)। उदाहरण के लिए अस्पष्टता = 0.5 सेट करना काम करता है, लेकिन चूंकि कोई पारदर्शिता नहीं है, इसलिए प्रभाव सिर्फ मंद हो गया है ...
मैंने इस एक्सटेंशन का उपयोग किया है और ऐसा लगता है कि मैं जो कुछ कह सकता हूं उससे पारदर्शिता जैसा कुछ भी प्रस्तुत नहीं करता है। –