2007-07 / 2007-07-18

前のエントリ: zsh コマンドAを入力中に別のコマンドBを入力して再度コマンドAを入力 [shell]
次のエントリ: GDで画像編集 [perl]

キーコードの送信
2007-07-18-2 / カテゴリ: [programming][win][c] / [permlink]

キーボードエミュレーション、とでも言うのかな。
キーボードの入力をプログラムで行う。
winuser.h を include する。

単一キーの場合
INPUT		key;
LPINPUT		lpKey = &key;
WORD		wKey;

wKey = 'A';
lpKey->type = INPUT_KEYBOARD;
lpKey->ki.wVk = wKey;
lpKey->ki.wScan = (WORD)MapVirtualKey(wKey, 0);
lpKey->ki.dwFlags = 0;
lpKey->ki.dwExtraInfo = 0;
lpKey->ki.time = 0;
SendInput((UINT)1, lpKey, sizeof(INPUT));

lpKey->ki.dwFlags = KEYEVENTF_KEYUP;
SendInput((UINT)1, lpKey, sizeof(INPUT));
アクティブなウインドウに a が入力される。'a' でなく 'A' なのがポイント?

キーコンビネーション (Shift - a => 'A')
// 'a' の SendInput の前に
wKey = VK_SHIFT;
lpKey->type = INPUT_KEYBOARD;
lpKey->ki.wVk = wKey;
lpKey->ki.wScan = (WORD)MapVirtualKey(wKey, 0);
lpKey->ki.dwFlags = 0;
lpKey->ki.dwExtraInfo = 0;
lpKey->ki.time = 0;
SendInput((UINT)1, lpKey, sizeof(INPUT));

// 'a'(KEYUP) の後に
wKey = VK_SHIFT;
lpKey->type = INPUT_KEYBOARD;
lpKey->ki.wVk = wKey;
lpKey->ki.wScan = (WORD)MapVirtualKey(wKey, 0);
lpKey->ki.dwFlags = KEYEVENTF_KEYUP;
lpKey->ki.dwExtraInfo = 0;
lpKey->ki.time = 0;
SendInput((UINT)1, lpKey, sizeof(INPUT));
で、'A' が入力される。

コントロールなら VK_CONTROL とか。winuser.h に定義されてる。
正直よくわかってない^^;

会社のPCは「5分でスクリーンロックするよう設定すること」という社内ルールがあるが、PCを操作せずに参照しながら作業の時にすげーウザいので、240秒毎に Ctrl 押下イベントを上げ続けるアプリを(こっそり)作ってみた :p
まぁ、PCの参照onlyの作業ってあんまりないから作っただけで使ってないけど。

参考
ctrl + v のエミュレーション
SendInput - MSDN

API見た感じでは、nInputs(第1引数)とcbSize(第3引数)の値でまとめてイベント要求できそうなんだけど、うまくいかない…(戻り値が0になる)
前のエントリ: zsh コマンドAを入力中に別のコマンドBを入力して再度コマンドAを入力 [shell]
次のエントリ: GDで画像編集 [perl]

2013 : 01 02 03 04 05 06 07 08 09 10 11 12
2012 : 01 02 03 04 05 06 07 08 09 10 11 12
2011 : 01 02 03 04 05 06 07 08 09 10 11 12
2010 : 01 02 03 04 05 06 07 08 09 10 11 12
2009 : 01 02 03 04 05 06 07 08 09 10 11 12
2008 : 01 02 03 04 05 06 07 08 09 10 11 12
2007 : 01 02 03 04 05 06 07 08 09 10 11 12
2006 : 01 02 03 04 05 06 07 08 09 10 11 12
2005 : 01 02 03 04 05 06 07 08 09 10 11 12
2004 : 01 02 03 04 05 06 07 08 09 10 11 12

最終更新時間: 2013-05-02 16:12