

ただし、これらのWindows機能のすべてのウィンドウのルールにウィンドウ(アプリケーション)を強制的に従わせることができることをおそらく知らないでしょう。 これを行うには、 デスクトップウィンドウマネージャーAPIを学習する必要があります 。
それではどこから始めますか? いつものように、.net(WinFormsまたはWPF)でアプリケーションを作成する場合、必要なメソッドをインポートする必要があります。 WinFormsの場合、HWNDウィンドウを取得するのは非常に簡単です。これには、 Form :: Handleプロパティがあり、WPFの場合はWindowInteropHelperクラスを使用できるため、メインウィンドウのHWNDを次のように記述できます。
IntPtr hwnd = new WindowInteropHelper(Application.Current.MainWindow).Handle; * This source code was highlighted with Source Code Highlighter .
IntPtr hwnd = new WindowInteropHelper(Application.Current.MainWindow).Handle; * This source code was highlighted with Source Code Highlighter .
IntPtr hwnd = new WindowInteropHelper(Application.Current.MainWindow).Handle; * This source code was highlighted with Source Code Highlighter .
必要な機能に戻りましょう。 注意が必要な最初の関数はDwmIsCompositionEnabledです 。これにより、コンピューターでAeroグラスが有効になっているかどうかを判断できます。
*このソースコードは、 ソースコードハイライターで強調表示されました。
- パブリック 部分 クラス FormSample:Form
- {
- [DllImport( "dwmapi.dll" 、PreserveSig = false )]
- public static extern bool DwmIsCompositionEnabled();
- パブリック FormSample()
- {
- InitializeComponent();
- if (Environment.OSVersion.Version.Major <6)
- {
- // Dwmが機能しない、古いバージョンのWindows
- }
- else if (!DwmIsCompositionEnabled())
- {
- // Aero GlassおよびAero 3Dは無効です(サポートされていません)
- }
- 他に
- {
- // Aero GlassとAero 3Dの仕事
- }
- }
- }
さて、これでDwmを「再生」するタイミングがわかりました。Dwnを使用するのに役立つ次の関数はDwmSetWindowAttributeです。 これは、ウィンドウを制御し、システムに表示方法を伝えるための主要な機能です。
たとえば、最初のアクション。 タスクは、ユーザーがAero Peekモード(ガジェットに似たアクション)をオンにしても表示されるようなアプリケーションを作成することです。 モニターで実行中のウィンドウの束を想像してください。WinKey+ Tabを使用して目的のウィンドウを探すのが面倒ですが、WinKey + Spaceを使用して必要なウィンドウを表示したい-それは通常のメッセンジャーであり、あなたが従う何らかのプロファイラーである可能性があります何かの仕事、まあ、はるかに。 たとえば、この記事「 Joel 'Jaykul' Bennett-Fun with PInvoke and Aero Peek 」では、人気のミランダメッセンジャーでこれを行う方法について説明しています(この記事から、私はDwnとそれが提供する機会に興味がありました)。 確かに、この記事ではDwmNCRenderingPolicyフラグを使用します。これは、DWMWA_EXCLUDED_FROM_PEEKではなく、DWMWA_NCRENDERING_POLICYフラグを使用する場合の値の設定に実際に適しています。 通常のフォームの場合、これは次のように実行できます。
*このソースコードは、 ソースコードハイライターで強調表示されました。
- パブリック 部分 クラス FormSample:Form
- {
- [旗]
- パブリック 列挙型 DwmWindowAttribute
- {
- ExcludedFromPeek = 12
- }
- [DllImport( "dwmapi.dll" 、PreserveSig = false )]
- public static extern int DwmSetWindowAttribute( IntPtr hwnd、 int attr、 ref int attrValue、 int attrSize);
- public static void RemoveFromAeroPeek( IntPtr hwnd)
- {
- int attrValue = 1; // TRUE
- DwmSetWindowAttribute(hwnd、( int )DwmWindowAttribute.ExcludedFromPeek、 ref attrValue、 sizeof ( int ));
- }
- パブリック FormSample()
- {
- InitializeComponent();
- // Aero Peekで可視化する
- RemoveFromAeroPeek(ハンドル);
- }
- }
結果は次のようになります(したがって、私が書いていることはより明確になります)。

また、ウィンドウをAero 3Dルールに従わなくすることもできます(これは、WinKey + Tabを使用してウィンドウを切り替える場合です)。 これを行うには、属性DWMWA_FLIP3D_POLICYを考慮する必要があります。「通常の動作」、「3Dの上に表示」、「3Dに表示」に値を設定できますが、「通常の動作」または「3Dに表示」 。
*このソースコードは、 ソースコードハイライターで強調表示されました。
- パブリック 部分 クラス FormSample:Form
- {
- [旗]
- パブリック 列挙型 DwmWindowAttribute
- {
- Flip3DPolicy = 8
- }
- // 3Dポリシーを反転
- パブリック 列挙体Flip3DPolicy
- {
- デフォルト= 0
- ExcludeBelow、
- ExcludeAbove
- }
- [DllImport( "dwmapi.dll" 、PreserveSig = false )]
- public static extern int DwmSetWindowAttribute( IntPtr hwnd、 int attr、 ref int attrValue、 int attrSize);
- public static void SetFlip3DPolicy( IntPtr hwnd)
- {
- int attrValue =( int )Flip3DPolicy.ExcludeBelow;
- DwmSetWindowAttribute(hwnd、( int )DwmWindowAttribute.Flip3DPolicy、 ref attrValue、 sizeof ( int ));
- }
- パブリック FormSample()
- {
- InitializeComponent();
- SetFlip3DPolicy(ハンドル);
- }
- }
結果は次のとおりです。

これをどのように使用できるかは、すでに想像するのが困難です。 まあ...私のビジネスは言うことです:)幸運を!