HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2014
1211
TomoTomo【初心者】ソフトウェアキーボードを作りたい3解決


TomoTomo

リンク

2014/12/11(Thu) 14:29:52|NO.66408

ソフトウェアキーボードを作りたいのですが
ひらがな、カタカナの出力はできますか?
できるなら スクリプトを教えて下さい。



この記事に返信する


SADOUS

リンク

2014/12/11(Thu) 20:53:57|NO.66414

丁寧にやるのなら
自分なら1ボタンずつ当たり判定を作って
(この場合はRPGで使う判定とか色を使った判定のほうが効率的?)
変数に加算していきます。

if Akey当たり判定 & マウスクリック(瞬間){
text+="あ"
}

onkey gosub*ラベルを利用して、キーボード入力にもリンクして
ソフトウェアキーボードが光ったりしたら面白いですね



暇人

リンク

2014/12/12(Fri) 01:26:59|NO.66422

↓で使ったモジュールをキーコードも送れるようにしてみた
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



TomoTomo

リンク

2014/12/12(Fri) 09:45:02|NO.66424

ありがとうございます。参考にさせていただきす。



ONION software Copyright 1997-2023(c) All rights reserved.