2013-07-23 13 views
6

私はバッテリーレベルに応じてWindows 7のエアロの色を変えるプログラムを作ることを考えています。私はC#にかなり新しいと私は、Windows 7のAeroを変更する方法を知りたいのですが、プログラムWindows 7 Aero/Windowの枠線の色をプログラム的に変更するには?

私が持っているこのコード私はそれを使用してカスタムカラーを設定する方法がわからない、けれども

[DllImport("dwmapi.dll", EntryPoint = "#127", PreserveSig = false)] 
    public static extern void DwmGetColorizationParameters(out WDM_COLORIZATION_PARAMS     parameters); 

[DllImport("dwmapi.dll", EntryPoint = "#131", PreserveSig = false)] 
public static extern void DwmSetColorizationParameters(WDM_COLORIZATION_PARAMS parameters, uint uUnknown); 

public struct WDM_COLORIZATION_PARAMS { 
    public uint Color1; 
    public uint Color2; 
    public uint Intensity; 
    public uint Unknown1; 
    public uint Unknown2; 
    public uint Unknown3; 
    public uint Opaque; 
} 

答えて

9

はありません。これは設計によるものです。この設定は、ユーザによって変更されることを意図しており、アプリケーションによって変更されることはありません。また、ユーザーがこれを行うために使用する組み込みのアプレットがあります:パーソナライズコントロールパネル。

しかし、あなたはヒントを得たコードのように、 APIの文書化されていないものがあります。DwmSetColorizationParametersです。ターゲットとするすべてのオペレーティングシステムでコードが動作することを慎重にテストするだけで、新しいバージョンのWindowsおよび/または現在のバージョンのWindowsへの更新によって中断する可能性があることに注意してください。

Windows 7で動作していたのは知っていますが、すべての最新のサービスパックやその他のアップデートでテストしていませんし、Windows 8でも動作するかどうかはわかりません。あなたはテストする。文書化されていないAPIを使用することは多くの作業です。

あなたは幸運です。 Someone elseはすでにリバースエンジニアリングを行っています。 (。。あなたがあなたの質問に表示コードを書いた人それはいいだろうが、彼らに信用を与えることのように、おそらく、あまりにも、多分それはthis guy他の人でした?)

ここ

は、あなたがそれを使用する方法は次のとおりです。

using System; 
using System.Drawing; 
using System.Globalization; 
using System.Runtime.InteropServices; 

class DwmManager 
{ 
    private struct DWM_COLORIZATION_PARAMS 
    { 
     public uint clrColor; 
     public uint clrAfterGlow; 
     public uint nIntensity; 
     public uint clrAfterGlowBalance; 
     public uint clrBlurBalance; 
     public uint clrGlassReflectionIntensity; 
     public bool fOpaque; 
    } 

    [DllImport("dwmapi.dll", EntryPoint = "#127", PreserveSig = false)] 
    private static extern void DwmGetColorizationParameters(out DWM_COLORIZATION_PARAMS parameters); 

    [DllImport("dwmapi.dll", EntryPoint = "#131", PreserveSig = false)] 
    private static extern void DwmSetColorizationParameters(ref DWM_COLORIZATION_PARAMS parameters, 
                  bool unknown); 

    // Helper method to convert from a Win32 BGRA-format color to a .NET color. 
    private static Color BgraToColor(uint color) 
    { 
     return Color.FromArgb(Int32.Parse(color.ToString("X"), NumberStyles.HexNumber)); 
    } 

    // Helper method to convert from a .NET color to a Win32 BGRA-format color. 
    private static uint ColorToBgra(Color color) 
    { 
     return (uint)(color.B | (color.G << 8) | (color.R << 16) | (color.A << 24)); 
    } 

    // Gets or sets the current color used for DWM glass, based on the user's color scheme. 
    public static Color ColorizationColor 
    { 
     get 
     { 
     // Call the DwmGetColorizationParameters function to fill in our structure. 
     DWM_COLORIZATION_PARAMS parameters; 
     DwmGetColorizationParameters(out parameters); 

     // Convert the colorization color to a .NET color and return it. 
     return BgraToColor(parameters.clrColor); 
     } 
     set 
     { 
     // Retrieve the current colorization parameters, just like we did above. 
     DWM_COLORIZATION_PARAMS parameters; 
     DwmGetColorizationParameters(out parameters); 

     // Then modify the colorization color. 
     // Note that the other parameters are left untouched, so they will stay the same. 
     // You can also modify these; that is left as an exercise. 
     parameters.clrColor = ColorToBgra(value); 

     // Call the DwmSetColorizationParameters to make the change take effect. 
     DwmSetColorizationParameters(ref parameters, false); 
     } 
    } 
} 

プロジェクトにそのクラスが追加されたら、ColorizationColorプロパティでそのクラスとやり取りします。コメントのように、DWM_COLORIZATION_PARAMS構造はロットより多くの情報を提供します。必要に応じて、これらの追加パラメータを取得/設定するプロパティを追加できます。彼らが何をするかを正確に把握するために、いくつかの実験が必要になります。

これらの機能を実行する前に、DWMコンポジションがホストオペレーティングシステムでサポートされ、有効になっていることを確認する必要があります。 (そうでなければ、PreserveSig属性によって例外がスローされます)これはかなり明白ですが、とにかく言及する価値があります。私はそれ故に何のC++経験タグのC#を持っていないとしてそれは、私のような誰かに正確に役立つ良いチュートリアルですが、ない

[DllImport("dwmapi.dll")] 
private static extern int DwmIsCompositionEnabled(ref bool pfEnabled); 
+0

うわー。ありがとう。私はこれを後でチェックして、病気に戻ってきます。本当にありがとう。 – Trontor

+0

完璧に動作します!構造体が次の形式で使用されていることはわかりませんでした。DWM_COLORIZATION_PARAMS dwm = new DWM_COLORIZATION_PARAMS(); – Trontor

+1

@Trontor確かに。 C#では、それがクラスであれ構造体であれ、同じ方法で新しいオブジェクトを作成します。すべての構造体メンバはデフォルト値に初期化されます。これは、 'uint'のような数値型は' 0'です。しかし、あなたは 'DwmGetColorizationParameters'関数にそのリファレンスを渡そうとしているので、そのメンバーを埋めるようにしています。それは本当に重要ではありません。 :-) –

1

この小さなapplicationのデベロッパにお問い合わせください。彼がどのようにそれをしたか尋ねる。私は彼がこれを達成するためにC#を使用したか分からない。しかし、それはショットの価値がある。

これが私の最後の検索で、私は何も他の便利を見つけることができませんでした...これには文書化されたAPIは

+0

:これを行うには、あなたも、この機能が必要になります。 – Trontor

+0

あなたは正しいです、私はそれが 'C#'のためだと思った、私の編集されたリンクをチェックしてください。 – DeMama

+0

新しいリンクでは、アプリケーションの自体を有効にする方法について説明しますが、ウィンドウの色は変更しません。 – Trontor

関連する問題