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


HSPTV!掲示板


未解決 解決 停止 削除要請

2013
0911
エルHSP以外のウィンドウに文字列入力14解決


エル

リンク

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となってしまい
"テスト"というカタカナの文字列を外部ウィンドウに入力したいのにうまくいきません。
なにかいい方法はないでしょうか?



この記事に返信する


fortunehill

リンク

2013/9/11(Wed) 10:39:52|NO.57080

/*クリップボード経由じゃ駄目なの?*/



Humi

リンク

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 }

と自分なりに追加してみましたがうまく出来ませんでした。
どうすればいいでしょうか?



fortunehill

リンク

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



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