キーボードフックのテストモジュール

CTRL+ALT+矢印でマウスが動く。CTRL+ALT+SHIFT+矢印で移動単位が大きくなる。ESCキーでアプリが終了する。

このコードでは、こいつが常駐しているときにはCTRL+ALT+矢印などは本来のアプリへはメッセージが送られないというのもテストしている。e.Handled = trueのところだ。このプロパティをtrueにするとCallNextHookExを呼ばないように昨日のHookクラスでは書いてあったのだが、狙い通りに機能しているようだ。

マウスフックのif文は何かというと、
「自分のフォーム上にマウスがあった場合はどうすべきだ?」
と思って書いてみた。先日の想像図であったようにメインフォームにはその時々のマウス下の画面キャプチャーの拡大図が表示される。ということはメインフォームそのものにマウスが乗るといったい何が表示されるべきなんだろう??

  1. 何も表示しない(つまりフォームの灰色の初期状態にする)
  2. マウスがフォームに入る直前の画像

のどちらかにするべきなんだろう。ここは私の独断で決めちゃっていい部分なんだが、まあコードとしては1にしとくと楽そうなんだが灰色なんて情報としてまったく無意味なので2の方にしたいと思う。

using System;
using System.Drawing;
using System.Windows.Forms;
using System.ComponentModel;
using garu.Util;

namespace garu.Testhook
{
    partial class MainForm : Form
    {
        KeyboardHook keyHook = new KeyboardHook();
        MouseHook mouHook = new MouseHook();

        public MainForm()
        {
            InitializeComponent();
            keyHook.KeyDown += delegate(object sender, KeyEventArgs e)
            {
                if (e.KeyCode == Keys.Escape)
                    Close();
                if (e.Control && e.Alt)
                {
                    int step = e.Shift ? 10 : 1;
                    Point pt = Cursor.Position;
                    switch (e.KeyCode)
                    {
                        case Keys.Left:
                            pt.X -= step;
                            break;
                        case Keys.Right:
                            pt.X += step;
                            break;
                        case Keys.Up:
                            pt.Y -= step;
                            break;
                        case Keys.Down:
                            pt.Y += step;
                            break;
                        case Keys.C:
                            // クリップボードへ色情報をコピーの予定
                            Clipboard.SetText("test");
                            break;
                        default:
                            return;
                    }
                    e.Handled = true;
                    Cursor.Position = pt;
                }
            };
            mouHook.MouseMove += delegate(object sender, MouseEventArgs e)
            {
                if (Win32.WindowFromPoint(e.Location) == Handle)
                {
                    // MainForm上にマウスがある
                    // 1.灰色にする?  1.直前画面のまま?
                }
                else
                {
                    // 別アプリ上にマウスがある
                    // マウス下の画像を拡大表示
                }
            };
        }

        protected override void OnClosing(CancelEventArgs e)
        {
            base.OnClosing(e);
            keyHook.Dispose();
            mouHook.Dispose();
        }
    }
}