DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

ユーザー設定の変更をイベントで受け取る

システムカラー、アイコン、キー入力、マウス、システム電源などのユーザー情報が変更されると、SystemEventsクラスのUserPreferenceChangedイベントが発生しますので、これを調べることにより、ユーザー情報が変更されたことを知ることができるようになります。

下の例では、Form1が表示されてから閉じるまでユーザー設定の変更を監視し、変更されると、その内容を表示しています。

VB.NET
コードを隠すコードを選択
'Imports Microsoft.Win32
'がソースファイルの一番上に書かれているものとする。

'ユーザー設定の変更を監視する

Private Sub Form1_Load(ByVal sender As Object, _
        ByVal e As System.EventArgs) _
        Handles MyBase.Load
    'イベントをイベント ハンドラに関連付ける
    'フォームコンストラクタなどの適当な位置に記述してもよい
    AddHandler SystemEvents.UserPreferenceChanged, _
        AddressOf SystemEvents_UserPreferencesChanged
End Sub

Private Sub Form1_Closed(ByVal sender As Object, _
        ByVal e As System.EventArgs) _
        Handles MyBase.Closed
    'イベントを解放する
    'フォームDisposeメソッド内の基本クラスのDisposeメソッド呼び出しの前に
    '記述してもよい
    RemoveHandler SystemEvents.UserPreferenceChanged, _
        AddressOf SystemEvents_UserPreferencesChanged
End Sub

'ユーザー設定が変更されたとき
Private Sub SystemEvents_UserPreferencesChanged( _
        ByVal sender As Object, _
        ByVal e As UserPreferenceChangedEventArgs)
    Dim s As String
    Select Case e.Category
        Case UserPreferenceCategory.Accessibility
            s = "障害を持つユーザー用のシステムユーザー補助に" _
                + "関連付けられているユーザー設定"
        Case UserPreferenceCategory.Color
            s = "ウィンドウやメニューの既定の色など、" _
                + "システムカラーに関連付けられているユーザー設定"
        Case UserPreferenceCategory.Desktop
            s = "システムデスクトップに関連付けられているユーザー設定"
        Case UserPreferenceCategory.General
            s = "ほかのどのカテゴリにも関連付けられていないユーザー設定"
        Case UserPreferenceCategory.Icon
            s = "アイコンの高さや間隔など、" _
                + "アイコン設定に関するユーザー設定"
        Case UserPreferenceCategory.Keyboard
            s = "キー入力時の文字の表示間隔など、" _
                + "キーボード設定に関するユーザー設定"
        Case UserPreferenceCategory.Locale
            s = "文字エンコーディングやカルチャ文字列など、" _
                + "カルチャに関するユーザー設定"
        Case UserPreferenceCategory.Menu
            s = "メニュー遅延やテキストの配置など、" _
                + "メニュー設定に関するユーザー設定"
        Case UserPreferenceCategory.Mouse
            s = "ダブルクリックの速度やマウスの感度など、" _
                + "マウス設定に関するユーザー設定"
        Case UserPreferenceCategory.Policy
            s = "ユーザー権限やアクセス レベルなど、" _
                + "ポリシー設定に関するユーザー設定"
        Case UserPreferenceCategory.Power
            s = "システム電源の設定に関するユーザー設定"
        Case UserPreferenceCategory.Screensaver
            s = "スクリーンセーバーに関連付けられているユーザー設定"
        Case UserPreferenceCategory.Window
            s = "システムウィンドウの大きさや" _
                + "特性に関連付けられているユーザー設定"
    End Select
    s += "が変更されました。"
    Console.WriteLine(s)
    Console.WriteLine(e.Category)
End Sub
C#
コードを隠すコードを選択
//using Microsoft.Win32;
//がソースファイルの一番上に書かれているものとする。

//ユーザー設定の変更を監視する

private void Form1_Load(object sender, System.EventArgs e)
{
    //イベントをイベント ハンドラに関連付ける
    //フォームコンストラクタなどの適当な位置に記述してもよい
    SystemEvents.UserPreferenceChanged +=
        new UserPreferenceChangedEventHandler(SystemEvents_UserPreferenceChanged);
}

private void Form1_Closed(object sender, System.EventArgs e)
{
    //イベントを解放する
    //フォームDisposeメソッド内の基本クラスのDisposeメソッド呼び出しの前に
    //記述してもよい
    SystemEvents.UserPreferenceChanged -=
        new UserPreferenceChangedEventHandler(SystemEvents_UserPreferenceChanged);
}

//ユーザー設定が変更されたとき
private void SystemEvents_UserPreferenceChanged(object sender,
        UserPreferenceChangedEventArgs e)
{
    string s = "";
    switch (e.Category)
    {
        case UserPreferenceCategory.Accessibility:
            s = "障害を持つユーザー用のシステムユーザー補助に"
                + "関連付けられているユーザー設定";
            break;
        case UserPreferenceCategory.Color:
            s = "ウィンドウやメニューの既定の色など、"
                + "システムカラーに関連付けられているユーザー設定";
            break;
        case UserPreferenceCategory.Desktop:
            s = "システムデスクトップに関連付けられているユーザー設定";
            break;
        case UserPreferenceCategory.General:
            s = "ほかのどのカテゴリにも関連付けられていないユーザー設定";
            break;
        case UserPreferenceCategory.Icon:
            s = "アイコンの高さや間隔など、"
                + "アイコン設定に関するユーザー設定";
            break;
        case UserPreferenceCategory.Keyboard:
            s = "キー入力時の文字の表示間隔など、"
                + "キーボード設定に関するユーザー設定";
            break;
        case UserPreferenceCategory.Locale:
            s = "文字エンコーディングやカルチャ文字列など、"
                + "カルチャに関するユーザー設定";
            break;
        case UserPreferenceCategory.Menu:
            s = "メニュー遅延やテキストの配置など、"
                + "メニュー設定に関するユーザー設定";
            break;
        case UserPreferenceCategory.Mouse:
            s = "ダブルクリックの速度やマウスの感度など、"
                + "マウス設定に関するユーザー設定";
            break;
        case UserPreferenceCategory.Policy:
            s = "ユーザー権限やアクセス レベルなど、"
                + "ポリシー設定に関するユーザー設定";
            break;
        case UserPreferenceCategory.Power:
            s = "システム電源の設定に関するユーザー設定";
            break;
        case UserPreferenceCategory.Screensaver:
            s = "スクリーンセーバーに関連付けられているユーザー設定";
            break;
        case UserPreferenceCategory.Window:
            s = "システムウィンドウの大きさや"
                + "特性に関連付けられているユーザー設定";
            break;
    }
    s += "が変更されました。";
    Console.WriteLine(s);
    Console.WriteLine(e.Category);
}
注意:上のコードではFormのClosedイベントを使用していますが、.NET Framework 2.0以降では、代わりにFormClosedイベントを使用してください。

SystemEventsクラスにはUserPreferenceChangingイベントというものもあり、これはユーザー設定が変更されているときに発生します。使い方は、UserPreferenceChangedイベントとほぼ同じです。

また、SystemEventsクラスはその他にも、下に示すように、様々なシステムイベントを提供します。詳しくは「SystemEvents クラス」をご覧ください。

SystemEventsメンバ 説明
DisplaySettingsChanged ユーザーが表示設定を変更すると発生
DisplaySettingsChanging 表示設定が変更されているときに発生(.NET Framework 2.0で追加)
EventsThreadShutdown システム イベントを待機するスレッドが終了する前に発生
InstalledFontsChanged ユーザーがシステム フォントを追加するか、またはシステム フォントを削除すると発生
LowMemory システムで使用可能な RAM が不足すると発生
PaletteChanged ユーザーが、別のパレットを使用するアプリケーションに切り替えると発生
PowerModeChanged ユーザーがシステムを中断または再開すると発生
SessionEnded ユーザーがシステムからログオフするか、システムをシャットダウンすると発生
SessionEnding ユーザーがシステムからログオフしようとした場合、またはシステムをシャットダウンしようとした場合に発生
SessionSwitch 現在ログインしているユーザーが変更された場合に発生(.NET Framework 2.0で追加)
TimeChanged ユーザーがシステム時間を変更すると発生
TimerElapsed ウィンドウ タイマ間隔が経過したときに発生
UserPreferenceChanged ユーザー設定が変更されると発生
UserPreferenceChanging ユーザー設定を変更しているときに発生
  • 履歴:
  • 2007/1/26 .NET Framework 2.0に関する記述を追加。

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • コードの先頭に記述されている「Imports ??? がソースファイルの一番上に書かれているものとする」(C#では、「using ???; がソースファイルの一番上に書かれているものとする」)の意味が分からないという方は、こちらをご覧ください。
  • .NET Tipsをご利用いただく際は、注意事項をお守りください。