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


HSPTV!掲示板


未解決 解決 停止 削除要請

2007
0510
通りすがりキー情報送信18未解決


通りすがり

リンク

2007/5/10(Thu) 23:18:35|NO.8179

他のアプリケーションをHSPで操作するプログラムを作っています。

#include "hspext.as" exec "notepad" aplsel "無題" aplact aplkey 32 wait 5 stop
試しに上記のようなプログラムを作ったのですが、キー情報が送信されません。
どこが間違っているのでしょうか?



この記事に返信する


osakana

リンク

2007/5/11(Fri) 02:51:09|NO.8182

文字を入力したいという事であれば、
aplobj でキーを送るオブジェクトを選択します。

#include "hspext.as" exec "notepad" aplsel "無題 - メモ帳",0 if stat=1 :dialog "失敗" :end aplact aplobj "edit" repeat 26 aplkey 65+cnt wait 10 loop wait 10 aplkey 70,4 aplkey 88 wait 10 aplsel "メモ帳",0 aplobj "",1 aplkey 78 end
ちなみにAPIで同じような事をする keybd_event と言う物もあります。
(#define を使って aplkey っぽく書ける様にして見ました。)

#uselib "user32.dll" #func keybd_event "keybd_event" int,int,int #define aplkeyd(%1) keybd_event %1,0,0 #define aplkeyu(%1) keybd_event %1,0,2 #define aplkey(%1) aplkeyd %1 :aplkeyu %1 exec "notepad" wait 50 repeat 26 aplkeyd 16 aplkey 65+cnt aplkeyu 16 wait 10 loop aplkeyd 18 aplkey 'F' aplkeyu 18 aplkey 'X' wait 50 aplkey 'N'



KIMU

リンク

2007/5/11(Fri) 03:04:45|NO.8183

一応aplsel+aplobj で出来ました。

#include "hspext.as" exec "notepad" aplsel "無題" if stat=1{dialog "無題 が見つかりません":end} mes refstr aplobj "Edit" if stat=1{dialog "Edit が見つかりません":end} mes refstr aplact b="HSP APLKEY TEST" ;大文字の英字とスペースの文字コードがキーコードと同じなのを利用 repeat strlen(b) a=peek(b,cnt) aplkey a mes a await 1 loop stop
hspextってあまり使った事が無いから
これで良いのかは良く分からないけど・・・



通りすがり

リンク

2007/5/11(Fri) 17:44:56|NO.8189

ご回答ありがとうございます。
二方のスクリプトを実行したところ、メモ帳に自動入力がされました。
aplobjという命令がキーワードみたいですね。
実はメモ帳以外のアプリケーションでも同じようなことがしたいのです。
具体的には、シューティングゲームでHSPから玉を発射するキーを押したという情報を送信することや
RPGで↑方向に移動するキーを押したという情報を送信するなどといったことです。
それともこれらのこととメモ帳に自動入力は別物なのでしょうか?^^;
キーを押したという情報を送信するのは同じなので、応用でできるかな?と思ったのですがうまくいきません。
aplobjという命令に関してもあまり理解できていません。(文字を入力する場所を指定する命令?)
ご教授お願いいたします。



KENTA

リンク

2007/5/13(Sun) 10:24:23|NO.8215

必ず全ての情報に送れるというわけではありません。
HSPエディタは情報を送っても、反応しません。
だから、HSPソフトには無理でしょう・・・とは思いますが、
やったことがありませんので言い切れません。

>aplobjとは・・
aplsel命令で捕獲したウィンドウに属するオブジエクト(コントロール)を
捕獲して、メッセージを送信する準備をします。
成功すると、statに0が代入され、refstrに正確な
オブジェクトのクラス名が代入されます。

分かりました?



KIMU

リンク

2007/5/13(Sun) 18:55:29|NO.8226

>RPGで↑方向に移動するキーを押したという情報を送信するなどといったことです。
上に挙げた方法はウィンドウメッセージを受け取ってる物にしか使えないと思う
HSPのstickとかgetkeyみたいのには効果がない
それからWin2000以降(特にXP)はSendInputを使えって
事みたいなので後でちょっとサンプル出してみます。
(SendInputならstick、getkeyにも効果あった)



通りすがり

リンク

2007/5/13(Sun) 19:15:47|NO.8227

ご回答ありがとうございます。

>>KENTAさん
なんとなくは分かるのですが、オブジェクトというのが何を指すのかいまいち分かりません。
メッセージボックスやボタンなどのことをさすのでしょうか?
例えば次のスクリプトを実行すると・・・。

#include "hspext.as" exec "notepad" a=0 aplsel "無題" mes "start" repeat aplobj "",a if stat=0 { mes "ID:"+a+" Class:"+refstr+"" a+=1 } else { break } wait 1 loop mes "end" stop
メモ帳のオブジェクトをすべて表示するはずですが、Editしか出てきません。
メニューの「ファイル」や「編集」、右上の×ボタンはオブジェクトではないのでしょうか?

>>KIMUさん
SendInputというのは・・API関数とかいうやつでしょうか?
そのあたりは手を出したことがないけれど、今回を機に少し手を出してみようかな・・・。
サンプル期待しています。



KIMU

リンク

2007/5/14(Mon) 02:53:31|NO.8234

構造体メンバ名のwScan、time、dwExtraInfoは必要な場面が分からなかったので全て0にしてます。

#include "user32.as" #module #const global INPUT_MOUSE 0 #const global INPUT_KEYBOARD 1 //初期化 配列名 #deffunc inputs_init array _struct max=0 dim _struct,7 return //key_inputs 配列名、仮想キーコード、動作フラグ(0=ダウン 2=アップ) #deffunc key_inputs array _struct,int wVk,int dwFlags index=7*max //本当は(wScan<<16)|wVkになる? _struct(index)=INPUT_KEYBOARD,wVk,dwFlags,0,0,0,0 max++ return max //mus_inputs 配列名、x座標、y座標、ホイールデータ or Xボタンデータ、動作フラグ(MOUSEEVENTF_???) #deffunc mus_inputs array _struct,int x,int y,int dwData,int dwFlags index=7*max //環境依存か分からないけどmouse_eventでも絶対座標はこうしないと本当の座標にならない・・・ if $8000&dwFlags {_x=x<<6:_y=int(85.4*y)}else{_x=x:_y=y};座標がずれてるので無理やり合わせてる(相対座標もずれるけどそのまま) _struct(index)=INPUT_MOUSE,_x,_y,dwData,dwFlags,0,0 max++ return max #global #const VK_SHIFT $10 #const VK_HOME $24 #const VK_END $23 #const KEYEVENTF_EXTENDEDKEY $1 #const KEYEVENTF_KEYUP $2 ;キーを離す #const KEYEVENTF_UNICODE $4 #const KEYEVENTF_SCANCODE $8 #const MOUSEEVENTF_MOVE $1 ;マウス移動 #const MOUSEEVENTF_LEFTDOWN $2 ;左を押す #const MOUSEEVENTF_LEFTUP $4 ;左を離す #const MOUSEEVENTF_MIDDLEDOWN $20 ;中を押す #const MOUSEEVENTF_MIDDLEUP $40 ;中を離す #const MOUSEEVENTF_RIGHTDOWN $8 ;右を押す #const MOUSEEVENTF_RIGHTUP $10 ;右を離す #const MOUSEEVENTF_XDOWN $0080 ;Xボタン操作(使えるか知らない) #const MOUSEEVENTF_XUP $0100 #const MOUSEEVENTF_WHEEL $800 ;ホイール操作 #const MOUSEEVENTF_ABSOLUTE $8000 ;スクリーン座標指定(これが無いときは現在地からの移動) #const XBUTTON1 $1 ;Xボタン操作時にdwDataに渡す値 #const XBUTTON2 $2 #const WHEEL_FORWORD 1 ;ホイール操作時にdwDataに渡す値 #const WHEEL_BACKWORD -1 screen 0,640,480,0,0,0:tmp="":input tmp exec "notepad":mes "wait":wait 200:mes "START":a="ABCDEFGhijklmn":mes a inputs_init inp ;登録数と配列初期化 repeat strlen(a):b=peek(a,cnt) if b<=90 {if sf=0 {key_inputs inp,VK_SHIFT,0:sf=1}}else{ ;大文字ならシフト押し下げ b-32 if sf=1 {key_inputs inp,VK_SHIFT,KEYEVENTF_KEYUP:sf=0}} key_inputs inp,b,0 ;登録数がstatに返る key_inputs inp,b,KEYEVENTF_KEYUP loop if sf=1 {key_inputs inp,VK_SHIFT,KEYEVENTF_KEYUP:sf=0} ;シフトが上がってなかったら上げる mus_inputs inp,ginfo(6)/2,ginfo(7)/2,0,MOUSEEVENTF_MOVE|MOUSEEVENTF_ABSOLUTE ;ついでにマウス移動も登録してみる SendInput stat,varptr(inp),28 ;一度に渡すグループの数、配列のアドレス、1グループのバイト数(7*4) mes "イベント登録成功数 "+stat mes "wait":wait 100:mes "notepadファイルメニューを開く":wait 100 inputs_init inp key_inputs inp,18,0 key_inputs inp,'F',0 :key_inputs inp,'F',KEYEVENTF_KEYUP key_inputs inp,18,KEYEVENTF_KEYUP SendInput stat,varptr(inp),28 mes "イベント登録成功数 "+stat mes "wait":wait 100:mes "ファイルメニューから終了を選択":wait 100 ;ダイアログ出して終わり inputs_init inp key_inputs inp,'X',0 :key_inputs inp,'X',KEYEVENTF_KEYUP SendInput stat,varptr(inp),28 mes "イベント登録成功数 "+stat:wait 10 inputs_init inp mus_inputs inp,ginfo(6)-100,ginfo(5)+8,0,MOUSEEVENTF_MOVE|MOUSEEVENTF_ABSOLUTE ;HSPのタイトルバーに合わせる mus_inputs inp,0,0,0,MOUSEEVENTF_LEFTDOWN ;クリック mus_inputs inp,0,0,0,MOUSEEVENTF_LEFTUP key_inputs inp,9,0 :key_inputs inp,9,KEYEVENTF_KEYUP ;Tabでフォーカスをinputオブジェにする key_inputs inp,'E',0 :key_inputs inp,'E',KEYEVENTF_KEYUP key_inputs inp,'N',0 :key_inputs inp,'N',KEYEVENTF_KEYUP key_inputs inp,'D',0 :key_inputs inp,'D',KEYEVENTF_KEYUP mus_inputs inp,ginfo(6)-10,ginfo(5)+8,0,MOUSEEVENTF_LEFTDOWN|MOUSEEVENTF_MOVE|MOUSEEVENTF_ABSOLUTE ;閉じるボタンあたりに移動してクリック mus_inputs inp,0,0,0,MOUSEEVENTF_LEFTUP evmax=stat-2 ;最後の2個は後で実行 SendInput evmax,varptr(inp),28 mes "イベント登録成功数 "+stat:mes "wait":wait 100:mes "終了":wait 200 SendInput 2,varptr(inp(evmax*7)),28

ゲームを自動で動かしたいとかの場合は1フレーム以上押し下げた状態にしないと反応しないかもしれない・・・

#後は詳しい人に任せます(^^;



KIMU

リンク

2007/5/14(Mon) 12:55:12|NO.8239

ちょっと読み違いしてたかな?
>具体的には、シューティングゲームでHSPから玉を発射するキーを押したという情報を送信することや
これは、osakanaさんが示したkeybd_eventを使ってもダメだった?
ゲームの場合だと現在の状態を見るだろうからaplkey見たいに
連続でON/OFFする入力は速すぎて読み取ってくれないと思う


>メニューの「ファイル」や「編集」、右上の×ボタンはオブジェクトではないのでしょうか?
コモンコントロールとかがオブジェクト(コントロール)なのかも知れない(よく分かってない)
メモ帳の場合後はステータスバーみたい
HSPエディタの場合は

#include "hspext.as" objnam="" mesbox objnam,400,400,0,0 mes "ウィンドウID 検索" repeat await 0 aplsel "",cnt if stat=1{dialog "ウィンドウが見つかりません":end} n=refstr if stat=0 and instr(n,0,"HSPスクリプトエディタ")=0 {ID=cnt:break} ;ウィンドウID検索 loop mes "ID="+ID+" [title] "+ refstr+"\nstart" repeat aplobj "",cnt ;objが捕獲されるので if stat=0 { objnam+"ID:"+cnt+" Class:"+refstr+"\n" objprm 0,objnam }else{break} wait 1 aplsel "",ID ;ウィンドウIDを指定して再捕獲 loop mes "end" stop
こんな感じ



KIMU

リンク

2007/5/14(Mon) 19:16:52|NO.8246

>//環境依存か分からないけどmouse_eventでも絶対座標はこうしないと本当の座標にならない・・・
> if $8000&dwFlags {_x=x<<6:_y=int(85.4*y)}else{_x=x:_y=y};座標がずれてるので無理やり合わせてる(相対座標もずれるけどそのまま)
これは65535*65535を基準にした座標で絶対座標を指定するためだったみたい

_x=int((65535.0/ginfo(20))*x)+1 _y=int((65535.0/ginfo(21))*y)+1
こんな感じで絶対座標を指定できる
(+1しないと移動後の座標が足りなかった)

相対座標を指定する方はマウスの速度設定とかが影響してるみたい

#include "user32.as" #const global SPI_GETMOUSE 3 musInfo=0,0,0 SystemParametersInfo SPI_GETMOUSE,0,varptr(musInfo),0 mes stat repeat 3 mes musInfo(cnt) loop
これで収得できるデータから移動量を算出するらしい
(まだ計算の仕方は分かってない)



KIMU

リンク

2007/5/16(Wed) 00:00:44|NO.8280

2バイト文字の送信とローマ字>漢字変換をしてみるテスト
>//本当は(wScan<<16)|wVkになる?
これで良かったみたい

#include "user32.as" #const VK_RETURN $0D #const VK_SHIFT $10 #const VK_KANJI $19 #const VK_CONVERT $1C #const VK_HOME $24 #const VK_END $23 #const KEYEVENTF_EXTENDEDKEY $1 #const KEYEVENTF_KEYUP $2 ;キーを離す #const KEYEVENTF_UNICODE $4 #const KEYEVENTF_SCANCODE $8 screen 0,640,480,0,0,0:exec "notepad":mes "wait":wait 100 shiftjis_str="unicodeで文字送信テストてすとTESTtest" ;26文字 unicode_str="":cnvstow unicode_str,shiftjis_str ;unicodeに変換 evmax=0 repeat 26 wVk=0 :wScan=wpeek(unicode_str,cnt*2) inp(7*evmax)= 1, (wScan<<16) | wVk, KEYEVENTF_UNICODE,0,0,0,0 ;wScanにunicode(2バイト)をセットして dwFlagsにKEYEVENTF_UNICODE evmax++ loop inp(7*evmax)=1,0,KEYEVENTF_UNICODE|KEYEVENTF_KEYUP,0,0,0,0 :evmax++ ;UNICODEキーをアップ repeat 4 inp(7*evmax)=1,VK_RETURN,(cnt\2)*KEYEVENTF_KEYUP,0,0,0,0 :evmax++ ;決定、改行[Enter] loop shiftjis_str="KANNJIHENNKANNTESUTO HENNKANNGOSENNTAKUJYOUTAINISURU" ;ローマ字 repeat strlen(shiftjis_str) wVk=peek(shiftjis_str,cnt) :wScan=0 inp(7*evmax)= 1, (wScan<<16) | wVk,0,0,0,0,0 :evmax++ ; 仮想キーをセット(上のKEYEVENTF_UNICODEでIMEが起動してるからそのまま、IMEを起動させない方法もある?) inp(7*evmax)= 1, (wScan<<16) | wVk,KEYEVENTF_KEYUP,0,0,0,0 :evmax++ loop VK=VK_CONVERT,VK_RETURN,VK_KANJI ;IME 変換、決定、IME 漢字解除 repeat 3*2 inp(7*evmax)= 1, VK(cnt/2), (cnt\2)*KEYEVENTF_KEYUP,0,0,0,0 :evmax++ loop VK_F=VK_HOME,KEYEVENTF_EXTENDEDKEY ,VK_HOME, KEYEVENTF_KEYUP|KEYEVENTF_EXTENDEDKEY ,VK_SHIFT, 0 ,VK_END, KEYEVENTF_EXTENDEDKEY,VK_END,KEYEVENTF_KEYUP|KEYEVENTF_EXTENDEDKEY, VK_SHIFT, KEYEVENTF_KEYUP repeat 6 inp(7*evmax)= 1, VK_F(cnt*2), VK_F(cnt*2+1),0,0,0,0 :evmax++ ;Home,Shift+End loop mes "SendInput イベント開始" SendInput evmax,varptr(inp),28 mes "登録成功数["+stat+"]"

time、dwExtraInfoはどうすれば効果を試せるかが分からない
普通にキーを送るだけなら0でいいみたいだけど・・・

>相対座標を指定する方はマウスの速度設定とかが影響してるみたい
これはXPより前と後で全然違うらしい
XPでは使用するデータも違うみたい・・・
まぁ、速度じゃなく、相対座標を指定する必要はないか
(目標座標から加速度に合わせた相対座標の計算が分からないだけだけど・・・)



通りすがり

リンク

2007/5/16(Wed) 00:08:22|NO.8281

KIMUさんのスクリプトの意味がぜんぜん分からない・・・。
keybd_eventを使っても反応してくれませんでした。
自分にはまだ早すぎるのかな。
勉強せねば^^;



KIMU

リンク

2007/5/16(Wed) 08:08:40|NO.8284

>KIMUさんのスクリプトの意味がぜんぜん分からない・・・。
ちょっと余分な物付けすぎたかな?

>keybd_eventを使っても反応してくれませんでした。
多分DirectInputを使ってるのかも

>自分にはまだ早すぎるのかな。
とりあえず、下のサンプルをコピペしてそのまま実行してみてください
その後にゲームを起動して試してみて(動くかどうか分からないのに勉強して行くのは辛いと思うので・・・)

使い方は、起動するとウィンドウに16分割にラインの入った水色の円が表示されます。
マウスをその水色の部分に乗せる(乗せるだけ)とライン方向に合ったた矢印キーが押されます。


#include "user32.as" #const KEYEVENTF_KEYUP $2 //KEYEVENTF_EXTENDEDKEY [Shift][矢印キー]等を送る時に必要 //XPだからか拡張キー一つで完結する場合は無くても動く //[拡張キー]押しっぱなしで[拡張キー]を使う時は使わないと後からのキー操作でKEYUPしてしまうっぽい #const KEYEVENTF_EXTENDEDKEY $1 ;使用コードは拡張キー #const KEYEVENTF_SCANCODE $8 ;使用コードはハードウェアスキャン (DirectInputを使ってるアプリにもキーを送れる) wsize=320:cpos=wsize/2:screen 0,wsize,wsize,20,0,ginfo(21)/2-cpos:pih=atan(1,0):pi=pih*2:pie=pih/4 repeat 4 ;←↑→↓コードを配列にセット MapVirtualKey cnt+37,0 ;仮想キーコードをハードウェアスキャンコードに変更 VirtualKey(cnt)=stat ;コードを VirtualKey=←,↑,→,↓ な感じに配列に代入 KeyNo(stat)=cnt+1 ;コード数と同じ配列要素に[←]キーを 1番 としてナンバーを入れる teskey(cnt)=0 ;SendInputでキーが押されるキーの記憶用 loop //L=← :U=↑ :R=→ :D=↓ L=VirtualKey(0):U=VirtualKey(1):R=VirtualKey(2):D=VirtualKey(3):LU=(U<<16)|L:LD=(D<<16)|L:RU=(U<<16)|R:RD=(D<<16)|R kyc=U ,LU,LU ,L,L ,LD,LD ,D,D ,RD,RD ,R,R ,RU,RU ,U:kmes="無","←","↑","→","↓" ;kyc=8方向(16分割)のキーを配列要素0を↑として左回りに代入 minsiz=10*10+10*10 :maxsiz=100*100+100*100 :gsel 0,2 :cls 3 color 0,150,150:circle cpos-sqrt(maxsiz),cpos-sqrt(maxsiz),cpos+sqrt(maxsiz),cpos+sqrt(maxsiz),1:color 100 repeat 4:r=atan(cnt-(cnt=3)*4,cnt*(cnt=1)+(cnt=3)) line -sin(r)*wsize+cpos,-cos(r)*wsize+cpos,sin(r)*wsize+cpos,cos(r)*wsize+cpos line -sin(r-pie)*wsize+cpos,-cos(r-pie)*wsize+cpos,sin(r-pie)*wsize+cpos,cos(r-pie)*wsize+cpos:loop color :circle cpos-sqrt(minsiz),cpos-sqrt(minsiz),cpos+sqrt(minsiz),cpos+sqrt(minsiz),1 repeat mdifx=mousex-cpos :mdify=mousey-cpos r=atan(mdifx,mdify)+pi :kyno=limit(r/pie,0,15) :keybak=key :key=kyc(kyno) ;円の中心からの角度を16方向に変換して配列 kyc からキーコードを収得(変数1個に二つ分のキーが入ってる) if (mdifx*mdifx+mdify*mdify)>minsiz and (mdifx*mdifx+mdify*mdify)<maxsiz and abs((ginfo(0)-(ginfo(4)+cpos))<cpos) and abs((ginfo(1)-(ginfo(5)+cpos))<cpos) {;水色の円の中 if keybak!key {;操作範囲内で前回と違うキーが選択された keyA=wpeek(key,0) :keyB=wpeek(key,2) ;keyから 下位2バイトを keyA に 上位2バイトを keyB に代入 (0が代入された方はキーなし) repeat 4 ;KEYUPを先に送りたいので先に設定 if teskey(cnt)=1 { ;down中のキーが if keyA!VirtualKey(cnt) and keyB!VirtualKey(cnt) {;選択されたキーと違ったのでKEYUPを設定 inp(7*evmax)= 1, VirtualKey(cnt)<<16, KEYEVENTF_KEYUP|KEYEVENTF_EXTENDEDKEY|KEYEVENTF_SCANCODE,0,0,0,0 :evmax++ } } loop repeat 4 if keyA=VirtualKey(cnt) or keyB=VirtualKey(cnt) { ;選択されたキーが if teskey(cnt)=0 { ;現在押されてないのでdown設定 inp(7*evmax)= 1, VirtualKey(cnt)<<16, KEYEVENTF_EXTENDEDKEY|KEYEVENTF_SCANCODE,0,0,0,0 :evmax++} } loop } }else{;水色の円から出たのでkeyA:keyB:keyをクリアして keyA=0 :keyB=0 :key=0 repeat 4 ;down中のキーが有ったらKEYUPを設定 if teskey(cnt)=1 {inp(7*evmax)= 1, VirtualKey(cnt)<<16, KEYEVENTF_KEYUP|KEYEVENTF_EXTENDEDKEY|KEYEVENTF_SCANCODE,0,0,0,0 :evmax++} loop } if evmax>0 { repeat 4:if keyA=VirtualKey(cnt) or keyB=VirtualKey(cnt) {teskey(cnt)=1 }else{teskey(cnt)=0}loop;押されるキーを記録 SendInput evmax,varptr(inp),28 :evmax=0 :SIcnt++ title "SendInput("+SIcnt+")回 keyA["+kmes(KeyNo(keyA))+"] keyB["+kmes(KeyNo(keyB))+"]" } await 10 loop
DirectInputを使ってるゲームを2,3試したらちゃんと動いた
これでも動かないと今の自分には無理・・・



KIMU

リンク

2007/5/16(Wed) 08:12:56|NO.8285

言い忘れ
NO.8284のはウィンドウとマウスを使うのでフルスクリーンのゲームでは試せません・・・



v

リンク

2007/5/16(Wed) 15:43:48|NO.8289

KIMUのスクリプトなんて分からなくてもいいよ。
異常なまでに読みにくいし。



a

リンク

2007/5/16(Wed) 18:10:13|NO.8292

お前勇気ありすぎwwwなまじプログラムが書ける上級者と思って言えなかったことをwww
まぁあれじゃねぇの簡単すぎて答えにならないように配慮してるんだろ。



KIMU

リンク

2007/5/17(Thu) 22:57:29|NO.8319

まぁ、そのまま読もうとしたら読み憎いだろうなぁ
無理やり縮めたりしてるし・・・

ちょつと上の方の説明で勘違いしてた部分があったので簡単に纏めちゃいます。

#include "user32.as" //入力タイプ(type) #const INPUT_MOUSE 0 ;マウスイベント #const INPUT_KEYBOARD 1 ;キーボードイベント #const INPUT_HARDWARE 2 ;ハードウェアイベント //動作を指定するフラグ(dwFlags) #const KEYEVENTF_KEYDOWN $0 ;KEYEVENTF_KEYUPを指定しなければ押す事になる #const KEYEVENTF_EXTENDEDKEY $1 ;[Shift][矢印キー]等の[拡張キー]を使う場合に指定 #const KEYEVENTF_KEYUP $2 ;キーを離す #const KEYEVENTF_UNICODE $4 ;wScanにユニコードを使う時に指定 #const KEYEVENTF_SCANCODE $8 ;ハードウェアスキャンコードの方を有効にしたい時に指定 onkey gosub *label :a="abc":input a ;キーが送られたかのチェック用 /* // キーボードイベント //index: sizeはバイト単位 index: size: paraname: 0: 4: type://INPUT_KEYBOARD 4: 2: wVk://仮想キーコード 6: 2: wScan://ユニコード(2バイト) 又は ハードウェアスキャンコード(仮想キーコードを MapVirtualKey で変換) 8: 4: dwFlags://KEYEVENTF_??? 12: 4: time://具体例見つからず・・・(通常0);time,dwExtraInfoのindexは試せて無いのでこれで合ってるかは不明 16: 4: dwExtraInfo://必要な場合は GetMessageExtraInfo で得られるデータを入力 (使わないなら0) //例 pInputs = type, wVk+(wScan<<16), dwFlags, time, dwExtraInfo, 0,0 ;一つの登録に28バイト(配列要素数7)必要(0,0はサイズ合わせ) */ dim pInputs,7,1 ;入力イベント登録用配列(今回は二次元配列を使うので最初に初期化) type = INPUT_KEYBOARD wVk = 40 ;[→] MapVirtualKey wVk,0 wScan = stat dwFlags = KEYEVENTF_EXTENDEDKEY mes "type="+type+" wVk="+wVk+" wScan="+wScan+" dwFlags="+dwFlags pInputs(0,0) = type, wVk+(wScan<<16), dwFlags pInputs(0,1) = type, wVk+(wScan<<16), (dwFlags | KEYEVENTF_KEYUP) nInputs = 2 cbSize = 4*7 SendInput nInputs, varptr(pInputs), cbSize ;登録実行(wait待ちせずに直ちに入力が開始される) mes "登録成功数 : "+stat stick stk ;stick実行前にOn/Offが終わってるので入力を検知できない mes "stick : "+stk wait 10 SendInput 1, varptr(pInputs(0,0)), cbSize ;一つずつ登録実行(連続で実行しても他の入力に割り込まれる可能性がある) stick stk mes "stick : "+stk SendInput 1, varptr(pInputs(0,1)), cbSize stop *label mes "iparam["+iparam+"] wParam["+wparam +"] lParam["+(lparam)+"]" mes "["+(((lparam>>16)&$ff))+"] ["+(((lparam>>24)&$ff))+"]\n" return
KEYEVENTF_EXTENDEDKEYの補足説明
1・[拡張キー]の操作でKEYEVENTF_SCANCODEを設定した場合は、これも指定しないとテンキーが押された事になる

KEYEVENTF_UNICODEの補足説明
1・wVkにコードがある時はKEYEVENTF_UNICODEが無視される(wVkのキーが押されてwScanの1バイトもスキャンコードとして送られる)
2・KKEYEVENTF_UNICODE | KEYEVENTF_SCANCODE と設定した場合KEYEVENTF_SCANCODEが優先されてKKEYEVENTF_UNICODEが無視される

KEYEVENTF_SCANCODEの補足説明
1・これを設定した場合 wVk は無視される
2・これが指定されてない時には wVk のキーが押されるが
wScan も送られるので、DirectInputを使ってるアプリも操作できる可能性がある

(注:補足説明は自分で検証した結果なので間違いや環境依存を含んでる可能性があります)


検索で HSP keybd_event なら色々出てくるけど
HSP SendInput だと全然無いんだねぇ・・・
(HSPの具体的なサンプルは一つも見つからなかった)



ss

リンク

2007/6/5(Tue) 19:49:53|NO.8777

SendInputの使い方を探していたら、
めちゃくちゃわかりやすい例があるじゃないですか!


他に例が無くて困ってました
>検索で HSP keybd_event なら色々出てくるけど
>HSP SendInput だと全然無いんだねぇ・・・
>(HSPの具体的なサンプルは一つも見つからなかった)


KIMUさん纏めありがとうございます



f

リンク

2007/7/7(Sat) 02:28:49|NO.9302

age



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