↓で使ったモジュールをキーコードも送れるようにしてみた
http://hsp.tv/play/pforum.php?mode=pastwch&num=57079
ついでに同じ文字を連続させると数が少なくなるのを修正
モジュールとソフトウェアキーボードサンプル
JLInputで文字や文字列送信
KCInputでキーコード送信
キーボードエミュレーションなのでキー押しっぱなしにすると
実際のキーが押されてることになるので注意(実際のキーを押して離せば戻る)
#module
#uselib "user32.dll"
#func SendInput "SendInput" int,var,int
#cfunc MapVirtualKey "MapVirtualKeyA" int,int
#const VK_RETURN 0x0D
#const VK_OEM_COPY 0xF2
#const VK_OEM_AUTO 0xF3
#const VK_KANJI 0x19
#const KEYEVENTF_EXTENDEDKEY 1
#const KEYEVENTF_KEYUP 2
#const KEYEVENTF_UNICODE 4
#const KEYEVENTF_SCANCODE 8
//JLInput str_dat, wt, ent
// str_dat = 送信する文字列
// wt = 日本語入力になった後文字列送信までのミリ秒単位の待機時間(省略時1)
// ent = 送信後のIME状態指定(省略時0)[0=変換確定 1=確定しない 2=IMEOFF 3=IMEトグル(3が指定された場合str_datは無視される)]
//statに送信された文字数が返る
//文字列送信後は日本語入力のままになる(JLInput "" にするとIMEONにするだけ)
#deffunc JLInput str str_dat,int wt,int ent
if ent=3 {//IMEトグル(ONならOFFにOFFならONに)
dim si,7*2
mvk=MapVirtualKey(VK_OEM_AUTO,0)
si(0)= 1, (mvk<<16) | VK_OEM_AUTO, KEYEVENTF_SCANCODE
si(7)= 1, (mvk<<16) | VK_OEM_AUTO, KEYEVENTF_KEYUP | KEYEVENTF_SCANCODE
SendInput 2,si,28
return 0
}
//---IMEON
if kan=0{
mvk=MapVirtualKey(VK_OEM_COPY,0)
kan(0)= 1, (mvk<<16) | VK_OEM_COPY, KEYEVENTF_SCANCODE,0,0,0,0
kan(7)= 1, (mvk<<16) | VK_OEM_COPY, KEYEVENTF_KEYUP | KEYEVENTF_SCANCODE,0,0,0,0
}
SendInput 2,kan,28
//---
await 0
await limit(wt,1,10000) //IMEの起動に時間がかかるので待つ(起動途中の入力は捨てられる)
dat=str_dat
size=strlen(dat)
if size=0 {
dim si,7*2
if ent=2 {//IMEがONになってるはずなのでOFFになる
mvk=MapVirtualKey(VK_OEM_AUTO,0)
si(0)= 1, (mvk<<16) | VK_OEM_AUTO, KEYEVENTF_SCANCODE
si(7)= 1, (mvk<<16) | VK_OEM_AUTO, KEYEVENTF_KEYUP | KEYEVENTF_SCANCODE
SendInput 2,si,28
}
return 0
}
unicnt=0
sdim unicode,size*2+2
cnvstow unicode,dat
repeat
if wpeek(unicode,cnt*2)=0{break}
unicnt++
loop
dim si,7*(unicnt*4+2)
//文字列登録
repeat unicnt
si(7*cnt*2)= 1, (wpeek(unicode,cnt*2)<<16), KEYEVENTF_UNICODE
si(7*(cnt*2+1))= 1, (wpeek(unicode,cnt*2)<<16), KEYEVENTF_KEYUP | KEYEVENTF_UNICODE
loop
if ent=2 {//IMEがONになってるはずなのでOFFになる
mvk=MapVirtualKey(VK_OEM_AUTO,0)
si(7*unicnt*2)= 1, (mvk<<16) | VK_OEM_AUTO, KEYEVENTF_SCANCODE
si(7*(unicnt*2+1))= 1, (mvk<<16) | VK_OEM_AUTO, KEYEVENTF_KEYUP | KEYEVENTF_SCANCODE
SendInput unicnt*2+2,si,28
}else{
if ent=0 {//Enter
mvk=MapVirtualKey(VK_RETURN,0)
si(7*unicnt*2)= 1, (mvk<<16) | VK_RETURN, KEYEVENTF_SCANCODE
si(7*(unicnt*2+1))= 1, (mvk<<16) | VK_RETURN, KEYEVENTF_KEYUP| KEYEVENTF_SCANCODE
SendInput unicnt*2+2,si,28
}else{
SendInput unicnt*2,si,28
}
}
return unicnt
//KCInput kc, kud
// kc = 送信するキーコード
// kud = キー動作指定(省略時0)[0=押して離す 1=押す 2=離す]
//戻り値refstrに送信されたキーコードをアスキー文字にしたのが返る
#deffunc KCInput int kc,int kud
dim si,7*2
unicnt=0
mvk=MapVirtualKey(kc,0)
if (kc>=91 and kc<=111) or (kc>=33 and kc<=40) or (kc>=45 and kc<=46) {//0 . 1 2 3 4 5 6 7 8 9 ↑ ← → ↓ Insert Del Home End PageUp PageDown Windowsキー メニューキー用
//エクステンドキーには抜けがあるかも・・・
if (kud & 2)=0 :si(0)= 1, (mvk<<16) | 0, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_SCANCODE :unicnt++
if (kud & 1)=0 :si(unicnt*7)= 1, (mvk<<16) | 0, KEYEVENTF_KEYUP | KEYEVENTF_EXTENDEDKEY | KEYEVENTF_SCANCODE :unicnt++
}else{
if (kud & 2)=0 :si(0)= 1, (mvk<<16) | 0, KEYEVENTF_SCANCODE :unicnt++
if (kud & 1)=0 :si(unicnt*7)= 1, (mvk<<16) | 0, KEYEVENTF_KEYUP | KEYEVENTF_SCANCODE :unicnt++
}
SendInput unicnt,si,28
return strf("%c",MapVirtualKey(kc,2))
#global
//----モジュールここまで
//------フォーカスの無いウィンドウにする(クリックしてもアクティブにならない)
#uselib "user32"
#cfunc GetWindowLong "GetWindowLongA" sptr,sptr
#func SetWindowLong "SetWindowLongA" sptr,sptr,sptr
#const WS_EX_NOACTIVATE $08000000 // クリックしてもアクティブにならない タスクバーに表示されなくなる。
#const GWL_EXSTYLE $FFFFFFEC // EXSTYLEに設定する
bgscr 0,400,200
SetWindowLong hwnd,GWL_EXSTYLE,GetWindowLong(hwnd,GWL_EXSTYLE)|WS_EX_NOACTIVATE
width 340,200,0,0 //スタイル変更したときはウィンドウ自体を再描画した方が良い
gsel 0,2 //最前面にしないと他のウィンドウの上に出来なくなる
//------
pos 50,110
objsize 20,20
keyname=""
repeat 26
kyename(cnt)=strf("%c",65+cnt) //a〜zのキーコードをアスキーコードにして順番に保存
pos 16+24*(cnt\13),16+24*(cnt/13)
button gosub kyename(cnt),*英字 //キー毎のボタンを作る
bid(stat)=65+cnt //ボタンのIDを要素数としてキーコードを保存
loop
aiueo="あ","い","う","え","お","ア","イ","ウ","エ","オ"
repeat 10
pos 160+24*(cnt\5),70+24*(cnt/5)
button gosub aiueo(cnt),*文字 //キー毎のボタンを作る
bid(stat)=cnt //ボタンのIDを要素数として文字のインデックスを保存
loop
pos 60,70
objsize 48,20
button gosub "半/全",*半全
button gosub "ひらがな",*OEM_COPY
OEM_COPY_id=stat
button gosub "カタカナ",*OEM_COPY
button gosub "shift",*SHIFT
shift_id=stat
button gosub "SPACE",*SPACE
button gosub "Enter",*Enter
arrow="←","↑","→","↓"
arposx=-30,0,30,0
arposy=0,-20,0,20
repeat 4
pos 200+arposx(cnt),140+arposy(cnt)
button gosub arrow(cnt),*arrow_key
bid(stat)=0x25+cnt //0x25 VK_LEFT ←
loop
pos 280,170
button gosub "終了",*終了
//キー操作テスト用にメモ帳を起動(アクティブなウィンドウにキーが送られる)
exec "notepad"
stop
*英字
bo_id=stat
KCInput bid(bo_id),0 //statにボタンIDが入ってるのでこれをインデックスとしてキーコードを取り出しKCInputに送る
return
*文字
aiueo_index=bid(stat)
JLInput aiueo(aiueo_index) //文字送信
return
*半全
getkey k,0x10
if k {//シフトが押しっぱなしなのでアップしとく
KCInput 0x10,2 //VK_SHIFT 0x10
objprm shift_id,"shift"
}
KCInput 0xF3 //VK_OEM_AUTO 0xF3
return
*OEM_COPY
if stat=OEM_COPY_id {//ひらがな
KCInput 0xF2,0 //VVK_OEM_COPY 0xF2
await 0
await 10 //IME起動に時間がかかるので
KCInput 0xF2,0 //VVK_OEM_COPY 0xF2
}else{//カタカナ
KCInput 0xF2,0 //VVK_OEM_COPY 0xF2
await 0
await 10
KCInput 0x10,1 //VK_SHIFT 0x10
KCInput 0xF2,0 //VVK_OEM_COPY 0xF2
KCInput 0x10,2 //VK_SHIFT 0x10
}
return
*SHIFT
getkey k,0x10
if k {//シフトが押されてるから離す
KCInput 0x10,2 //VK_SHIFT 0x10
objprm shift_id,"shift"
}else{//シフトを押す
KCInput 0x10,1 //VK_SHIFT 0x10
objprm shift_id,"SHIFT"
}
return
*SPACE
KCInput 0x20 //VK_SPACE 0x20
return
*Enter
KCInput 0x0D //VK_RETURN 0x0D
return
*終了
getkey k,0x10
if k {//シフトが押しっぱなしなのでアップしとく
KCInput 0x10,2 //VK_SHIFT 0x10
}
end
return
*arrow_key
bo_id=stat
KCInput bid(bo_id)
return