« 2013年3月 | トップページ | 2013年6月 »

2013年5月

2013年5月14日 (火)

SendInput()でマルチバイト文字の入力をシュミレーション

Win32 AIPによるキーボード入力のシュミレーションはSendInput()やkeybd_event()を使用する。
ひらがなや漢字などのワイド文字の生成はkeybd_event()ではなくSendInput()を使用すると楽。
この時、SendInput()に渡す文字はユニコードとする。

UINT SendInput(
  UINT nInputs,
  LPINPUT pInputs,
  int cbSize
);

INPUT構造体は以下となっている。
typeにINPUT_KEYBOARDを設定し、
KEYBDINPUを使用する。

typedef struct tagINPUT {
  DWORD         type;
  MOUSEINPUT    mi;
  KEYBDINPUT    ki;
  HARDWAREINPUT hi;
} INPUT, *PINPUT;

KEYBDINPUT構造体は以下となっている。
dwFlagsにKEYEVENTF_UNICODEを設定し、
送りたい文字はwVkではなくwScanに設定する。
dwFlagsにはDWONだけでなくUPする必要がある。

typedef struct tagKEYBDINPUT {
  WORD      wVk;
  WORD      wScan;
  DWORD     dwFlags;
  DWORD     time;
  ULONG_PTR dwExtraInfo;
} KEYBDINPUT, *PKEYBDINPUT;

ワイド文字を含んだ文字列のキーボード入力をシュミレーションする関数の例。

1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
void KeyEvent(char *pinput)
{
    DWORD size;
    WCHAR *pwBuf;
    INPUT *pip;
‌ 
    pwBuf=(WCHAR*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,lstrlen(pinput)*2+sizeof(WCHAR));
    if(pwBuf==NULL){
        return;
    }
‌ 
    size=MultiByteToWideChar(CP_ACP,MB_PRECOMPOSED,pinput,-1,wBuf,sizeof(wBuf));
    size-=1;
    size*=2;
‌ 
    pip=(INPUT*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,size*sizeof(INPUT));
    if(pip==NULL){
        HeapFree(GetProcessHeap(),0,pwBuf);
        return;
    }
‌ 
    for(int i=0;i<size;i++){
        pip[i].type=INPUT_KEYBOARD;
        pip[i].ki.dwFlags=KEYEVENTF_UNICODE;
        pip[i].ki.wScan=pwBuf[i/2];
        if(i%2){
            pip[i].ki.dwFlags|=KEYEVENTF_KEYUP;
        }
    }
    SendInput(size,pip,sizeof(INPUT));
‌ 
    HeapFree(GetProcessHeap(),0,pip);
    HeapFree(GetProcessHeap(),0,pwBuf);
}
このコードは CodePublisher で生成しています

| | コメント (0) | トラックバック (0)

2013年5月 2日 (木)

窓掴み 0.33 公開

窓掴み 0.33を公開しました。

ダンロードページ

マウスボタンが左右入れ替えている環境での不具合を修正しました。
右利きの環境では動作に変更ありません。

| | コメント (0) | トラックバック (0)

« 2013年3月 | トップページ | 2013年6月 »