|
|
2013/9/11(Wed) 07:23:50|NO.57079
お世話になっております。
現在チャットマクロの用な物を作っているのですが
HSP以外のウィンドウに文字列入力するということは可能でしょうか?
#uselib "user32"
#func keybd_event "keybd_event" int, int, int
#func mouse_event "mouse_event" int, int, int
input a
wait 100
keybd_event 'T' : keybd_event 'T',0,2
keybd_event 'E' : keybd_event 'E',0,2
keybd_event 'S' : keybd_event 'S',0,2
keybd_event 'U' : keybd_event 'U',0,2
keybd_event 'T' : keybd_event 'T',0,2
keybd_event 'O' : keybd_event 'O',0,2
stop
サンプルなのでHSPウィンドウでキー入力していますが
見やすいように別ウィンドウに入力部分は省いています。
これでTESUTOとキーボード入力を自動でしてくれますが
日本語入力がOFFだとTESUTOとなってしまい
"テスト"というカタカナの文字列を外部ウィンドウに入力したいのにうまくいきません。
なにかいい方法はないでしょうか?
|
|
2013/9/11(Wed) 10:39:52|NO.57080
/*クリップボード経由じゃ駄目なの?*/
|
|
2013/9/11(Wed) 13:28:44|NO.57081
単に他のウィンドウのコントロール(ボタンとかメッセージボックス)とかに文字列を入れたいのであれば
SetWindowTextで入力してはいかかでしょうか?
|
|
2013/9/11(Wed) 21:27:18|NO.57088
>日本語入力がOFFだとTESUTOとなってしまい
これは当然でしょ
キーを直接押してるのと同じなんだから
>"テスト"というカタカナの文字列を外部ウィンドウに入力したいのにうまくいきません。
日本語入力ONにしても"てすと"になるから変換するか
入力モード自体を全角カタカナにする必要がある(自分以外のIMEモードは簡単には見えないのでやっかいだが)
"てすと"なら"テスト"ぐらいしかないから良いけど他はどうするの?
キー送信じゃなく文字列の"テスト"を送りたいなら方法はあると思う
でも送る相手によっては使えないので具体的に何に送るか書いた方が良い
sendmsgでWM_SETTEXTを使う例(質問はクリップボードへになってるが解決はウィンドウに文字列送信になってる)
外部アプリのクリックボードにメッセを送るやり方教えてください。
http://hsp.tv/play/pforum.php?mode=pastwch&num=28400
|
|
2013/9/11(Wed) 21:48:39|NO.57089
>fortunehill様
できればクリップボード経由じゃないほうがいいです
>Humi様
ありがとうございます。調べてみます。
>暇人さん
>>これは当然でしょ キーを直接押してるのと同じなんだから
すみませんちょっとわかりにくい説明していました。
日本語入力がONの時、日本語入力の時変換前で上のプログラムを実行したら「てすと」とでますが
正確にはこの変換前の状態で「てすと」として入力したかったのです。
実際やりたい例が「こんにちわ。」という文章を
別のソフトの文字入力ウィンドウ(HSPのInputみたいな感じの入力場所)に入力したかったのです。
これで「こんにちわ。」自動入力になるので続きを○○さんみたいに手動で打とうと思っていました。
リンクのほう参考にさせていただきます!ありがとうございます!
|
|
2013/9/14(Sat) 00:10:14|NO.57124
送信時日本語入力がOFFでもONにして文字列送信するモジユール
#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 KEYEVENTF_EXTENDEDKEY 1
#const KEYEVENTF_KEYUP 2
#const KEYEVENTF_UNICODE 4
#const KEYEVENTF_SCANCODE 8
//JLInput str_dat, wt
// str_dat = 送信する文字列
// wt = 日本語入力になった後文字列送信までのミリ秒単位の待機時間(省略時1)
//statに送信された文字数が返る
//文字列送信後は日本語入力のままになる(JLInput "" にするとIMEONにするだけ)
#deffunc JLInput str str_dat,int wt
//IMEON
if kan=0{
mvk=MapVirtualKey(VK_OEM_COPY,0)
kan(0)= 1, (mvk<<16) | VK_OEM_COPY, KEYEVENTF_SCANCODE;,0,0,0,0,0
kan(7)= 1, (mvk<<16) | VK_OEM_COPY, KEYEVENTF_KEYUP | KEYEVENTF_SCANCODE;,0,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 {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+2)
//文字列登録
repeat unicnt
si(7*cnt)= 1, (wpeek(unicode,cnt*2)<<16), KEYEVENTF_UNICODE
loop
//Enter
mvk=MapVirtualKey(VK_RETURN,0)
si(7*unicnt)= 1, (mvk<<16) | VK_RETURN, 0
si(7*(unicnt+1))= 1, (mvk<<16) | VK_RETURN, KEYEVENTF_KEYUP
SendInput unicnt+2,si,28
return unicnt
#global
//モジュールここまで
//使用サンプル
screen 0,300,200,0,0,0
exec "notepad"
mes "F6,F7,F8キーを押すと文字列を送信します"
a="F6が押されました","F7が押されました(改行します)\n","F8が押されました"
dim f,3
dim f_bak,3
repeat
repeat 3
getkey f(cnt),117+cnt
if f(cnt)=1 and f_bak(cnt)=0 {
JLInput a(cnt)
title ""+stat
}
f_bak(cnt)=f(cnt)
loop
await 16
loop
stop
現在アクティブなウィンドウに対して送る
| |
|
2013/9/15(Sun) 21:32:09|NO.57158
>暇人さん
これでやりたいことが達成できそうです!ありがとうございます!
文字入力中状態でJLInputを使う(例:はろー(手動打ち変換前)+JLInput文字列)と文字入力が確定されて
JLInputの文字列が入力されますが
文字入力中の変換を確定せずにJLInputを使うということは可能でしょうか?
それっぽい所をコメントアウトして確定されないようにチェックしていったのですがどうにもうまくいきませんでした。
si(7*unicnt)= 1, (mvk<<16) | VK_RETURN, 0
をコメントアウトしてJLInputの文字列は入力中状態には出来ました。
|
|
2013/9/15(Sun) 22:11:21|NO.57160
>文字入力中の変換を確定せずにJLInputを使うということは可能でしょうか?
F6,F7,F8はソフト側でIME操作に既に使われてる可能性があるので
操作キーを他のキーに割り当てれば出来ると思う
NO.57124のでもCtrl押しながらF6等押せば変換中の文字列は変換確定しない
>をコメントアウトしてJLInputの文字列は入力中状態には出来ました。
>#deffunc JLInput str str_dat,int wt
を
#deffunc JLInput str str_dat,int wt,int ent
に置き換えて
>//Enter
から
>return unicnt
の間を
if ent=0 {
mvk=MapVirtualKey(VK_RETURN,0)
si(7*unicnt)= 1, (mvk<<16) | VK_RETURN, 0
si(7*(unicnt+1))= 1, (mvk<<16) | VK_RETURN, KEYEVENTF_KEYUP
SendInput unicnt+2,si,28
}else{
SendInput unicnt,si,28
}
に置き換え
これでJLInput後に入力確定しないようにしたい時は
JLInput "あいうえお",1,1
にすれば良い(確定したい時はp3を0か省略)
|
|
2013/9/17(Tue) 02:08:46|NO.57192
>暇人様
ありがとうございます!
>>F6,F7,F8はソフト側でIME操作に既に使われてる可能性があるので
ご指摘の通り使われてました。確認不足で申し訳ありません。
完全に思った通りの動作するようにできました!
|
|
2013/9/19(Thu) 12:52:04|NO.57242
申し訳ありません。
ついでで申し訳ないのですが後もう一つ質問させていただけないでしょうか?
button等の命令を押したらIMEのONOFFのみを制御してみたいのですが
#const VK_OEM_AUTO 0xF3
//Enter
if ent=2 {
mvk=MapVirtualKey(VK_OEM_AUTO,0)
si(7*unicnt)= 1, (mvk<<16) | VK_RETURN, 0
si(7*(unicnt+1))= 1, (mvk<<16) | VK_RETURN, KEYEVENTF_KEYUP
}
と自分なりに追加してみましたがうまく出来ませんでした。
どうすればいいでしょうか?
|
|
2013/9/19(Thu) 13:35:44|NO.57244
/*ご参考(※部分が大事かと)*/
#uselib "user32.dll"
#func global GetForegroundWindow "GetForegroundWindow"
#func global SetWindowPos "SetWindowPos" sptr,sptr,sptr,sptr,sptr,sptr,sptr
#func global SendInput "SendInput" sptr,sptr,sptr
exec "notepad" :await
GetForegroundWindow :hh = stat ;※
button gosub "ON/OFF",*label
stop
*label
SetWindowPos hh,-1,0,0,0,0,$43 ;※操作対象にする為に必要
nn = 1,$F3,0,0,0,0,0,1,$F3,2,0,0,0,0
SendInput 2,varptr(nn),28 ;VK_OEM_AUTO(トグル)
return
|
|
2013/9/19(Thu) 13:51:14|NO.57245
>fortunehill様
ありがとうございます!これでもう大丈夫そうです!
API難しいけれど面白いですね〜。
|
|
2013/9/19(Thu) 21:15:23|NO.57256
NO.57242のはスキャンコードはVK_OEM_AUTOを渡してるがキーコードはVK_RETURNになってて
KEYEVENTF_SCANCODEを指定して無いからVK_RETURNが使われると思う
NO.57244のはフォーカスを送信先に移して送信する形だが
ボタンを押した時にHSPウィンドウにフォーカスを行かないようにする方法もある
KEYEVENTF_SCANCODE指定し忘れ(キーコードも渡してるから動作するソフトなら無くても問題ないが・・・)とかも修正したやつ
#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 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, 0
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,0
kan(7)= 1, (mvk<<16) | VK_OEM_COPY, KEYEVENTF_KEYUP | KEYEVENTF_SCANCODE;,0,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, 0
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+2)
//文字列登録
repeat unicnt
si(7*cnt)= 1, (wpeek(unicode,cnt*2)<<16), KEYEVENTF_UNICODE
loop
if ent=2 {//IMEがONになってるはずなのでOFFになる
mvk=MapVirtualKey(VK_OEM_AUTO,0)
si(7*unicnt)= 1, (mvk<<16) | VK_OEM_AUTO, 0
si(7*(unicnt+1))= 1, (mvk<<16) | VK_OEM_AUTO, KEYEVENTF_KEYUP | KEYEVENTF_SCANCODE
SendInput unicnt+2,si,28
}else{
if ent=0 {//Enter
mvk=MapVirtualKey(VK_RETURN,0)
si(7*unicnt)= 1, (mvk<<16) | VK_RETURN, 0
si(7*(unicnt+1))= 1, (mvk<<16) | VK_RETURN, KEYEVENTF_KEYUP| KEYEVENTF_SCANCODE
SendInput unicnt+2,si,28
}else{
SendInput unicnt,si,28
}
}
return unicnt
#global
//------フォーカスの無いウィンドウにする
#uselib "user32"
#cfunc GetWindowLong "GetWindowLongA" sptr,sptr
#func SetWindowLong "SetWindowLongA" sptr,sptr,sptr
#const WS_EX_NOACTIVATE $08000000 // クリックしてもアクティブにならない タスクバーに表示されなくなる。
#const GWL_EXSTYLE $FFFFFFEC // EXSTYLEに設定する
screen 0,300,200,2+8,0,0
SetWindowLong hwnd,GWL_EXSTYLE,GetWindowLong(hwnd,GWL_EXSTYLE)|WS_EX_NOACTIVATE //ウィンドウスタイル変更
width 300,200 //スタイル変更したときはウィンドウ自体を再描画した方が良い
gsel 0,2 //最全面にしないと他のウィンドウの上に出来なくなる
//------
exec "notepad"
mes "送信文字列"
notesel text
text="おはよう\nこんにちは\nおやすみ"
listbox text_index,60,text
pos 110,0
mes "送信モード"
mode_text="変換確定\n確定しない\nIMEOFF"
listbox mode_index,60,mode_text
pos 50,110
objsize 80,20
button gosub "送信",*送信
button gosub "IME_ON",*IMEON
button gosub "IME_OFF",*IMEOFF
button gosub "IME_ON_OFF",*IMEONOFF
stop
*送信
noteget note, text_index
title "モード="+mode_index+" "+note
JLInput note,1,mode_index
return
*IMEON
title "モード="+1
JLInput ""
return
*IMEOFF
title "モード="+2
JLInput "",1,2
return
*IMEONOFF
title "モード="+3
JLInput "",1,3
return
| |
|
2013/9/20(Fri) 11:22:04|NO.57261
>暇人様
対応できないウィンドウもあったので自分でも弄ってましたが
うまく行かなかったのでかなり助かりました!
さっそく導入させていただきます!
|
|
2013/9/20(Fri) 19:31:18|NO.57263
あ、まだKEYEVENTF_SCANCODE指定忘れがあった・・・
後配列初期化忘れも修正
#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+2)
//文字列登録
repeat unicnt
si(7*cnt)= 1, (wpeek(unicode,cnt*2)<<16), KEYEVENTF_UNICODE
loop
if ent=2 {//IMEがONになってるはずなのでOFFになる
mvk=MapVirtualKey(VK_OEM_AUTO,0)
si(7*unicnt)= 1, (mvk<<16) | VK_OEM_AUTO, KEYEVENTF_SCANCODE
si(7*(unicnt+1))= 1, (mvk<<16) | VK_OEM_AUTO, KEYEVENTF_KEYUP | KEYEVENTF_SCANCODE
SendInput unicnt+2,si,28
}else{
if ent=0 {//Enter
mvk=MapVirtualKey(VK_RETURN,0)
si(7*unicnt)= 1, (mvk<<16) | VK_RETURN, KEYEVENTF_SCANCODE
si(7*(unicnt+1))= 1, (mvk<<16) | VK_RETURN, KEYEVENTF_KEYUP| KEYEVENTF_SCANCODE
SendInput unicnt+2,si,28
}else{
SendInput unicnt,si,28
}
}
return unicnt
#global
//------フォーカスの無いウィンドウにする
#uselib "user32"
#cfunc GetWindowLong "GetWindowLongA" sptr,sptr
#func SetWindowLong "SetWindowLongA" sptr,sptr,sptr
#const WS_EX_NOACTIVATE $08000000 // クリックしてもアクティブにならない タスクバーに表示されなくなる。
#const GWL_EXSTYLE $FFFFFFEC // EXSTYLEに設定する
screen 0,300,200,2+8,0,0
SetWindowLong hwnd,GWL_EXSTYLE,GetWindowLong(hwnd,GWL_EXSTYLE)|WS_EX_NOACTIVATE
width 300,200 //スタイル変更したときはウィンドウ自体を再描画した方が良い
gsel 0,2 //最前面にしないと他のウィンドウの上に出来なくなる
//------
exec "notepad"
mes "送信文字列"
notesel text
text="おはよう\nこんにちは\nおやすみ"
listbox text_index,60,text
pos 110,0
mes "送信モード"
mode_text="変換確定\n確定しない\nIMEOFF"
listbox mode_index,60,mode_text
pos 50,110
objsize 80,20
button gosub "送信",*送信
button gosub "IME_ON",*IMEON
button gosub "IME_OFF",*IMEOFF
button gosub "IME_ON_OFF",*IMEONOFF
stop
*送信
noteget note, text_index
title "モード="+mode_index+" "+note
JLInput note,1,mode_index
return
*IMEON
title "モード="+1
JLInput ""
return
*IMEOFF
title "モード="+2
JLInput "",1,2
return
*IMEONOFF
title "モード="+3
JLInput "",1,3
return
| |
|