いろいろ調べてたのだが、よくよくコードを読んでみると
覚書/C♯/グローバルフック - PukiWiki
で公開されてるグローバルフックのコードに入力キーの握りつぶしも実装されてたのでこれを使ってやってみた。
とりあえずどのキーを押してもアクティブなアプリケーションにaが入力される鬱陶しいプログラムのエッセンス。
//LowLevelKeyboardProcの戻り値の部分。ここでCallNextHookExを呼ばなければいい。 return cancel ? (IntPtr)1 : Native.CallNextHookEx(s_hook, nCode, wParam, ref lParam);
//イベントハンドラを追加 KeybordCapture.KeyDown += = new EventHandler<KeybordCapture.KeybordCaptureEventArgs>(Global_KeyUp); //キー入力があったらそのイベントをCancelして代わりにSendKeysを使ってaを投げる private void Global_KeyDown(object sender, KeybordCapture.KeybordCaptureEventArgs e) { //リリースビルドでバイナリから実行したときだけうまく動くように #if !DEBUG e.Cancel = true; SendKeys.SendWait("a"); #endif }
どうも
[System.Runtime.InteropServices.StructLayout(System.Runtime.InteropServices.LayoutKind.Sequential)] public struct KBDLLHOOKSTRUCT { public int vkCode; public int scanCode; public int flags; public int time; public IntPtr dwExtraInfo; }
のdwExtraInfoを見て判断してるようなのだが実際の流れはあんまり理解できてない。というかIntPtrとかもよく分かってない。
とりあえずキーを押すとLowLevelKeyboardProcよりも先にGlobal_KeyDownが呼ばれて結果的にうまく動いてるようだ。
入力したいウインドウをちゃんとフォアグラウンドでアクティブにした状態で入力を送るには最初にキーが押されたときにウインドウハンドラを取得してどうにかすればいいのかな?
あとはe.KeyCodeを見てエミュレートするキーを変えてやればキーボードからの入力なりシリアルから送られたキーコードなりに応じて面白げな入力方式ができるってもんかしら。