|
|
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
|
|
2013/4/4(Thu) 10:44:27|NO.53422
なぜ問題のループが起こってしまうかを憶測すると、
キーが押される
↓
キーが押されていることになる処理
↓
キーが押されているので反応(繰り返し)
という無限ループが発生していると思われます。
これは少し工夫する必要がありそうです。頑張ってみてください。
|
|
2013/4/4(Thu) 19:02:12|NO.53439
ふむ…なるほど…
キーが押すという命令と押されているかという確認をする命令を使用している以上結構しょうがない
感じってことですよね…
むむむ。ただバグる原因が確定できたのは進歩です!ありがとうございます。
|
|
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
こんな感じに。
|
|
2013/4/4(Thu) 22:02:38|NO.53441
あれ?もしかしてキーボードの全角入力の話じゃなくてかなキーを使った入力の事言ってますか?
もしそうだったらそんな面倒なもの使う人はいないので気にしなくて大丈夫ですよ。
|
|
2013/4/4(Thu) 22:14:51|NO.53443
すいません…職場に…2人…いるんです…
|
|
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(だったっけ?)を使えば一時的なキー入力の割り込み中止ができる。
|
|
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
解決方法も二ついただきましたし解決済みマークにさせていただきます!
|
|