スナックelve 本店

バツイチ40代女の日記です

No.1228 キーボードのチャタリングキャンセラー的なモノ

携帯の人には申し訳ないプログラム系の記事。
記事が折りたためないのね。



hongliang.seesaa.net
を使ったのだがうまくキャンセルできなかった。

//LowLevelKeyboardProcの戻り値の部分。ここでCallNextHookExを呼ばなければいい。
return cancel ? (IntPtr)1 : Native.CallNextHookEx(s_hook, nCode, wParam, ref lParam);
http://d.hatena.ne.jp/yuta-celestial/20081014/1223977482

という記述を見つけた。元のコードは無かったけど(^_^;
http://azumaya.s101.xrea.com/wiki/index.php?%B3%D0%BD%F1%2FC%A2%F4%2F%A5%B0%A5%ED%A1%BC%A5%D0%A5%EB%A5%D5%A5%C3%A5%AF


つまーり、最初のサイトからダウンロードしたKeyboardHook3.csの

		private int CallNextHook(int code, KeyboardMessage message, ref KeyboardState state) {
			if (code >= 0) {
				KeyboardHookedEventArgs e = new KeyboardHookedEventArgs(message, ref state);
				OnKeyboardHooked(e);
				if (e.Cancel) {
					return -1;
				}
			}
			return CallNextHookEx(IntPtr.Zero, code, message, ref state);
		}

の「return -1;」値が1が正解だな!! よくわからんけどwwww


よしっ直したらうまくキャンセルされた!!


今は適切な値をちょこちょこ調査中w

using System;
using System.Windows.Forms;

namespace チャタリングキャンセラー
{
    public partial class Form1 : Form
    {
        public Keys key_type;
        public long  key_time;
        public Form1()
        {
            InitializeComponent();

            ShowInTaskbar = false;
            WindowState = FormWindowState.Minimized;
//            //フォームのKeyPreviewを切り替える
//            this.KeyPreview = !this.KeyPreview;
        }

        private void 終了ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            notifyIcon1.Visible = false;
            Application.Exit();

        }

        private void Form1_Load(object sender, EventArgs e)
        {
            Hide();
        }

        private void keyboardHook1_KeyboardHooked(object sender, KeyboardHookedEventArgs e)
        {
            if (e.UpDown == KeyboardUpDown.Down)
            {
                System.Diagnostics.Debug.WriteLine(e.KeyCode);
                if (key_type == e.KeyCode)
                {
                    //終了時刻をタイマ刻み数で取得する
                    key_time = DateTime.Now.Ticks - key_time;
                    if (key_time < 100000)
                    {
                        //入力イベントをキャンセルする
                        e.Cancel = true;
                        System.Diagnostics.Debug.WriteLine(e.KeyCode + ": キャンセル");
                    }
                }
                else
                {
                    key_type = e.KeyCode;
                    //開始時刻をタイマ刻み数で取得する
                    key_time = DateTime.Now.Ticks;
                }

            }

        }
    }
}