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


HSPTV!掲示板


未解決 解決 停止 削除要請

2013
0404
なうしきかな入力をローマ字入力に変換するプログラムを組んでいたのですが・・・13解決


なうしき

リンク

2013/4/4(Thu) 00:51:30|NO.53419

ローマ字入力しか受け付けないソフトでもかな入力派の人が入力ができるようにと
プログラムを作ってみたのですが、かな入力の「え」(数字の5)を押すと
「い」が入力されその後ひたすら「い」を入力しては消す…
というループに入ってしまいます。

どなたか解決策があれば教えていただけませんでしょうか?


#uselib "user32.dll" #func keybd_event "keybd_event" int,int,int,int repeat getkey key11,51 getkey key12,69 getkey key13,52 getkey key14,53 getkey key15,54 if key11 = 1 : keybd_event 8 : keybd_event 'A' : key11 = 0 if key12 = 1 : keybd_event 8 : keybd_event 'I' : key12 = 0 if key13 = 1 : keybd_event 8 : keybd_event 'U' : key13 = 0 if key14 = 1 : keybd_event 8 : keybd_event 'E' : key14 = 0 if key15 = 1 : keybd_event 8 : keybd_event 'O' : key15 = 0 await 100 loop




この記事に返信する


keitetsu1650

リンク

2013/4/4(Thu) 10:44:27|NO.53422

なぜ問題のループが起こってしまうかを憶測すると、

キーが押される
 ↓
キーが押されていることになる処理
 ↓
キーが押されているので反応(繰り返し)

という無限ループが発生していると思われます。
これは少し工夫する必要がありそうです。頑張ってみてください。
 



なうしき

リンク

2013/4/4(Thu) 19:02:12|NO.53439

ふむ…なるほど…
キーが押すという命令と押されているかという確認をする命令を使用している以上結構しょうがない
感じってことですよね…
むむむ。ただバグる原因が確定できたのは進歩です!ありがとうございます。



GrapeColor(DION)

リンク

2013/4/4(Thu) 21:59:20|NO.53440

最初から英数意外の文字を入力できないようにすればいいと思います。

#uselib "imm32.dll" #func ImmAssociateContext "ImmAssociateContext" int, int sdim a input a, 200 hInput = objinfo_hwnd(stat) ImmAssociateContext hInput, 0 stop
こんな感じに。



GrapeColor(DION)

リンク

2013/4/4(Thu) 22:02:38|NO.53441

あれ?もしかしてキーボードの全角入力の話じゃなくてかなキーを使った入力の事言ってますか?
もしそうだったらそんな面倒なもの使う人はいないので気にしなくて大丈夫ですよ。



なうしき

リンク

2013/4/4(Thu) 22:14:51|NO.53443

すいません…職場に…2人…いるんです…



KA

リンク

2013/4/4(Thu) 22:58:10|NO.53445

かな入力の切り替え方を教えれば解決です。
(普通にアルファベットを入力するときはどうしているんだろ。)

仮にプログラムが出来たとして、起動・終了させる手間と入力を切り替
える手間は同じでしょう。ノートパソコンでテンキーがないのかな、U
SBのテンキーでも買ってあげたらどうですか。



なうしき

リンク

2013/4/4(Thu) 23:48:38|NO.53446

説明不足ですいません。
問題のソフトなのですが
Alt+ひらがなキーもプロパティからのかな入力へ設定してもかな入力を
受け付けないソフトなのでおそらく切り替えはできないっぽいんです。



暇人

リンク

2013/4/5(Fri) 02:10:07|NO.53449

DLLは↓から
2007/10/12(Fri) HSPでキーフックしたいよ!
http://tu3.jp/0524

キーフックしてユニコードを送信(キーコードじゃないからキーが押される事も無い)

#uselib "user32.dll" #func SendInput "SendInput" int,int,int #const INPUT_MOUSE $00000000 ;マウスイベント #const INPUT_KEYBOARD $00000001 ;キーボードイベント #const INPUT_HARDWARE $00000002 ;ハードウェアイベント #const KEYEVENTF_KEYDOWN $00000000 ;KEYEVENTF_KEYUPを指定しなければ押す #const KEYEVENTF_EXTENDEDKEY $00000001 ;[拡張キー]を使う場合に指定 #const KEYEVENTF_KEYUP $00000002 ;キーを離す #const WM_KEYDOWN 0x0100 #const WM_KEYUP 0x0101 #const KEYEVENTF_UNICODE $4 #include "keyhook.hsp" screen 0,200,100 title "強制カナ入力ON" sdim KeyCode,64,300 //KeyCode('押されたキーコード')="送信する文字" KeyCode('3')="あ" KeyCode('E')="い" KeyCode('4')="う" KeyCode('5')="え" KeyCode('6')="お" KeyCode('T')="か" KeyCode('G')="き" KeyCode('H')="く" KeyCode(186)="け" KeyCode('B')="こ" UniCode=0 Key=0 khHook *onKeyHook if stat=0 : dialog "フック失敗" : end gsel 0,2 repeat wait 10 //キーが押されたら抜けるので数値適当 if Key { cnvstow UniCode,KeyCode(Key) //ユニコードに変換 input_struct =INPUT_KEYBOARD,(UniCode<<16),KEYEVENTF_KEYDOWN | KEYEVENTF_UNICODE,0,0,0,0 //UniCodeKEYDOWN input_struct(28) =INPUT_KEYBOARD,0,KEYEVENTF_KEYUP | KEYEVENTF_UNICODE,0,0,0,0 //UniCodeKEYUP SendInput 2,varptr(input_struct),28 //送信 Key=0 } loop stop *onKeyHook if (khStat = 0) or (khStat = 1) {// 0:押された 1:キーリピートが発生した if KeyCode(khKeyCode) ! "" { //カナ文字が設定されてるキー Key=khKeyCode return 1 } } return



甘酒

リンク

2013/4/5(Fri) 05:25:40|NO.53452

余計なお世話かもしれないけど、
stick(だったっけ?)を使えば一時的なキー入力の割り込み中止ができる。



KA

リンク

2013/4/5(Fri) 11:07:08|NO.53454

>>ローマ字入力しか受け付けないソフト
に対して
>>かな入力へ設定してもかな入力を受け付けない
それは当たり前です、日本語入力を切って英字の直接入力にしてください。

もう一度聞きますが、その人は英字や数字を入力するときはどうしているのでしょう。



暇人

リンク

2013/4/5(Fri) 20:11:09|NO.53458

配列要素にバイト数いれてた・・・
> input_struct(28) =INPUT_KEYBOARD,0,KEYEVENTF_KEYUP | KEYEVENTF_UNICODE,0,0,0,0 //UniCodeKEYUP


input_struct(7) =INPUT_KEYBOARD,0,KEYEVENTF_KEYUP | KEYEVENTF_UNICODE,0,0,0,0 //UniCodeKEYUP
に修正



NO.53449のが使えなかった場合の直接入力にも対応させたやつ↓
入力されたかなキーをローマ字キー押しに変換

#uselib "user32.dll" #func SendInput "SendInput" int,int,int #cfunc MapVirtualKey "MapVirtualKeyA" int,int #const INPUT_MOUSE $00000000 ;マウスイベント #const INPUT_KEYBOARD $00000001 ;キーボードイベント #const INPUT_HARDWARE $00000002 ;ハードウェアイベント #const KEYEVENTF_KEYDOWN $00000000 ;KEYEVENTF_KEYUPを指定しなければ押す #const KEYEVENTF_EXTENDEDKEY $00000001 ;[拡張キー]を使う場合に指定 #const KEYEVENTF_KEYUP $00000002 ;キーを離す #const WM_KEYDOWN 0x0100 #const WM_KEYUP 0x0101 #const KEYEVENTF_UNICODE $4 #const VK_MENU 0x12 //Alt  #include "keyhook.hsp" screen 0,200,100 sdim KeyCode,64,300 //KeyCode('押されたキーコード')="送信するローマ字" KeyCode('3')="A" KeyCode('E')="I" KeyCode('4')="U" KeyCode('5')="E" KeyCode('6')="O" KeyCode('T')="KA" KeyCode('G')="KI" KeyCode('H')="KU" KeyCode(186)="KE" KeyCode('B')="KO" Key=0 ro_ka=0 //かなキー変換モードON onoff=1 //ウィンドウ書き換えフラグ khHook *onKeyHook if stat=0 : dialog "フック失敗" : end gsel 0,2 font "MS 明朝",20,1 repeat await 100 //現在のアクティブウィンドウを定期的にチェックするので適当な数値に if ro_ka { if onoff=1 { title "かな入力OFF" color 50,100,150 boxf color 255 pos 0,20 mes "切換:ALT+SHIFT" mes "現在:通常入力" onoff=0 } }else{ if onoff=1 { title "かな入力ON" color 150,100,50 boxf color ,255 pos 0,20 mes "切換:ALT+SHIFT" mes "現在:ローマ字に変換" onoff=0 } if Key { repeat 2 Code=peek(KeyCode(Key),cnt) if Code=0 {break} input_struct(7*input_cnt) =INPUT_KEYBOARD,(MapVirtualKey(Code)<<16)+Code,KEYEVENTF_KEYDOWN ,0,0,0,0 input_cnt++ input_struct(7*input_cnt) =INPUT_KEYBOARD,(MapVirtualKey(Code)<<16)+Code,KEYEVENTF_KEYUP,0,0,0,0 input_cnt++ loop Key=0 SendInput input_cnt,varptr(input_struct),28 //送信 repeat await 1 if input_cnt=0 {break }//SendInput分が終るまでloop loop } } loop stop *onKeyHook if input_cnt>0 {input_cnt--:return }//SendInput分が終るまで直ぐに抜ける(SendInputのキー処理中は他の入力に邪魔されない) if ((khStat = 0) or (khStat = 1)) {// 0:押された 1:キーリピートが発生した if MENU=1 and (khStat = 0) {ro_ka^1:onoff=1:return}//ALT+SHIFT(モード切替) if khKeyCode=VK_MENU {MENU=1:return}//ALT if ro_ka=0 { //かなキー変換モード if KeyCode(khKeyCode) ! "" { //ローマ字が設定されてるキー Key=khKeyCode return 1 } } }else{ if khKeyCode=VK_MENU {MENU=0:return} } return



なうしき

リンク

2013/4/6(Sat) 00:30:36|NO.53462

>暇人さん
ありがとうございます!
unicord…こんなものがあるのですね…僕の知識不足で若干わからない部分もありますが
これを元に試作品を作ったので明日試してみようと思います!
もしだめだったら今度はしたの物を使わせていただきますね!ありがとうございます!

>甘酒さん
stickってキーボードのキーにも対応させれるんですか?

>KAさん
ゆっくり探して打ってます。



なうしき

リンク

2013/4/6(Sat) 00:31:03|NO.53463

解決方法も二ついただきましたし解決済みマークにさせていただきます!



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