web-dev-qa-db-ja.com

プログラムによるタイトルバーと境界線の色の設定

アプリケーションのタイトルバーと境界線の色をプログラムで変更しようとしています。いろいろ試してみましたが、成功しませんでした。これらの色をシステム全体で変更することにしました。アプリケーションの実行中にタイトルバーと境界線の色を変更し、アプリケーションの最後に元に戻すことも受け入れられるためです。 (管理された環境、実行中のアプリケーションの小さなセット)

これらの色を動的に変更することは可能ですか(プロセス全体、またはプロセス全体の変更が可能でない限りシステム全体)。これを達成する方法を提案できますか?

私は次のようなものを試しましたが、それは私がしたいことをしません:

int aElements[2] = {COLOR_WINDOW, COLOR_ACTIVECAPTION};
DWORD aOldColors[2];
DWORD aNewColors[2];

aOldColors[0] = GetSysColor(aElements[0]); 
aOldColors[1] = GetSysColor(aElements[1]); 
aNewColors[0] = RGB(0x80, 0x80, 0x80);  // light gray 
aNewColors[1] = RGB(0x80, 0x00, 0x80);  // dark purple 

SetSysColors(2, aElements, aNewColors);
SetSysColors(2, aElements, aOldColors);

前もって感謝します

[〜#〜] edit [〜#〜]

これはまさに私が欲しいものです:

enter image description here

23
Alpay

境界線とタイトルの再描画をカスタマイズすることはお勧めしません。正しい方法で行うのは本当に難しいです。 Officeは、クライアント領域にすべてを描画しますが、通常の境界線を使用します。 NC_Paintを正しい方法で使用するのは苦痛であり、ちらつきを引き起こす可能性があります。特に、最小化ボタン、最大化ボタン、閉じるボタンの配置は、ウィンドウごとに異なるため、困難です。また、アクセシビリティ、使用される大きなフォント、カスタマイズされたユーザー設定も考慮してください。

色を変える目的は何ですか?

グローバルカラーを変更するには、少なくともコードを分離する必要があります

//アプリケーションの起動時にこれを1回呼び出します(例:WM_CREATE)

SetSysColors(2, aElements, aNewColors); 

//アプリケーションを閉じるときにこれを呼び出します(例:WM_DESTROY)

SetSysColors(2, aElements, aOldColors); 
4
lexx9999

C++を使用していることは知っていますが、C#は便利です。アイデアを得るために、フォームの外観を変更する次のコードを見てください。

[DllImport("User32.dll", CharSet = CharSet.Auto)]
public static extern int ReleaseDC(IntPtr hWnd, IntPtr hDC);

[DllImport("User32.dll")]
private static extern IntPtr GetWindowDC(IntPtr hWnd);

protected override void WndProc(ref Message m)
{
    base.WndProc(ref m);
    const int WM_NCPAINT = 0x85;
    if (m.Msg == WM_NCPAINT)
    {
        IntPtr hdc = GetWindowDC(m.HWnd);
        if ((int)hdc != 0)
        {
            Graphics g = Graphics.FromHdc(hdc);
            g.FillRectangle(Brushes.Green, new Rectangle(0, 0, 4800, 23));
            g.Flush();
            ReleaseDC(m.HWnd, hdc);
        }
    }
}

また、CodePlexの Windowsフォームでのカスタム境界線の描画 プロジェクトを使用できます。このプロジェクトは、Windowsの非クライアント領域のカスタマイズなど、ユーザーがWindowsフォームをカスタマイズできる小さなライブラリです。

2
DOTNET Team

2番目のSetSysColors(2、aElements、aOldColors);を削除します。元の色に戻り、再試行するコード行。使用しているコード例は、MSDNリンクとほぼ同じようです https://msdn.Microsoft.com/en-us/library/windows/desktop/ms724940%28v=vs.85%29.aspx リンクマイナス睡眠。彼らの例は、色を設定し、スリープしてから元に戻す方法を示しています。

2
Joe