携帯の人には申し訳ないプログラム系の記事。
記事が折りたためないのね。
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; } } } } }