キーボードのNumLock状態をタスクトレイで確認できるようにした

えー、フツーでしょ、My.Computerクラスとか、え? 使えないの? インスタンス取るの? メンドクセー!!! が第一声w

新しい作業用PC、画面大きいし、テンキーあるし、メモリあるし、今のところ不満――あるんだな、これが。

NumLockキーのインジケーターが存在しないw

つまり、NumLockキーON/OFFが目視できないんだわ、いや、あるの当たり前だと思ってたんだけどさ、なかったんだわ、このPC。

なので、タスクトレイにインジケータつけておけばよくね?という発想に至る。

まぁ、あれだ、VBだと、さくっと一行で解決するんだわ。

https://msdn.microsoft.com/ja-jp/library/microsoft.visualbasic.devices.keyboard(v=vs.110).aspx

My.Computer.Keyboardにずばり、NumLock のBooleanいるしね。さくっと書いて終わり。

んじゃ面白くないから、勉強かねてC#でやろうとしたらさ、そしたらさ、My.Computer がない。My空間そのものがない。

まじかーorz

しょうがないから、Microsoft.VisualBasic.Devices 参照追加して、自分で書くorz

んでもって、作ったのがこちら。長いよw

/// <summary>
/// タスクトレイ専用アイコン制御するフォームクラス
/// </summary>
internal class MainForm : Form
{
    //動的変更するのでコンテナ化しとく
    private IContainer components = null;

    //アイコンも固定で持つ
    private NotifyIcon icon;

    //終わるよメニューは固定でもつ
    private ContextMenuStrip menu;

    private ToolStripMenuItem menuItem;

    //VBer必須のMy.Computerクラス
    private Computer myComputer;

    //タイマー
    private Timer timer;

    public MainForm()
    {
        //一回だけ処理
        ShowInTaskbar = false;
        initialize();
    }

    private void Close_Click(object sender, EventArgs e)
    {
        // 終わるよイベント 
        timer.Stop();
        timer.Dispose();
        Application.Exit();
    }

    private void initialize()
    {
        //初期化処理
        myComputer = new Computer();
        components = new System.ComponentModel.Container();
        icon = new NotifyIcon(components);

        //メニュー構成
        setMenu();

        //通知アイコン設定
        setNotifyIcon();

        //タイマー初期化
        timer = new Timer();
        timer.Interval = 1000;
        timer.Tick += new EventHandler(intervalCheck);
        timer.Start();
    }

    private void intervalCheck(object sender, EventArgs e)
    {
        // タイマーイベント 
        timer.Stop();
        setNotifyIcon();
        Refresh();
        timer.Start();
    }

    private void setMenu()
    {
        //メニュー作成
        menu = new ContextMenuStrip();
        menuItem = new ToolStripMenuItem();

        // 簡単な単語の場合、リソース提供のテキストにしておくと、
        // あとでGlobal化するとき困らないw
        menuItem.Text = Properties.Resources.M0001;
        //イベントハンドラ登録
        menuItem.Click += new EventHandler(Close_Click);

        menu.Items.Add(menuItem);
    }

    private void setNotifyIcon()
    {
        //VBerなら当たり前のことをC#でもさせてみるw
        //まさか、自分でクラスインスタンスとらないと
        //My.Computer使えないとかびっくりしたよ
        if (myComputer.Keyboard.NumLock)
        {
            icon.Icon = Properties.Resources.On;
            icon.Text = "NumLock ON";
        }
        else
        {
            icon.Icon = Properties.Resources.Off;
            icon.Text = "NumLock OFF";
        }
        icon.ContextMenuStrip = menu;
        icon.Visible = true;
    }
}

/// <summary>
/// NumLockすぐにわかるよインジケータ
/// </summary>
internal class MainWindow
{
    private static void Main()
    {
        MainForm rm = new MainForm();
        Application.Run();
    }
}

実行結果がこちら

image

あとはスタートアップに突っ込んでしばらく使っていろいろとチューニングしてくw