|
|
2007/5/10(Thu) 23:18:35|NO.8179
他のアプリケーションをHSPで操作するプログラムを作っています。
#include "hspext.as"
exec "notepad"
aplsel "無題"
aplact
aplkey 32
wait 5
stop
試しに上記のようなプログラムを作ったのですが、キー情報が送信されません。
どこが間違っているのでしょうか?
|
|
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'
|
|
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という命令に関してもあまり理解できていません。(文字を入力する場所を指定する命令?)
ご教授お願いいたします。
|
|
2007/5/13(Sun) 10:24:23|NO.8215
必ず全ての情報に送れるというわけではありません。
HSPエディタは情報を送っても、反応しません。
だから、HSPソフトには無理でしょう・・・とは思いますが、
やったことがありませんので言い切れません。
>aplobjとは・・
aplsel命令で捕獲したウィンドウに属するオブジエクト(コントロール)を
捕獲して、メッセージを送信する準備をします。
成功すると、statに0が代入され、refstrに正確な
オブジェクトのクラス名が代入されます。
分かりました?
|
|
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関数とかいうやつでしょうか?
そのあたりは手を出したことがないけれど、今回を機に少し手を出してみようかな・・・。
サンプル期待しています。
|
|
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フレーム以上押し下げた状態にしないと反応しないかもしれない・・・
#後は詳しい人に任せます(^^;
| |
|
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
こんな感じ
|
|
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
これで収得できるデータから移動量を算出するらしい
(まだ計算の仕方は分かってない)
|
|
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を使っても反応してくれませんでした。
自分にはまだ早すぎるのかな。
勉強せねば^^;
|
|
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試したらちゃんと動いた
これでも動かないと今の自分には無理・・・
| |
|
2007/5/16(Wed) 08:12:56|NO.8285
言い忘れ
NO.8284のはウィンドウとマウスを使うのでフルスクリーンのゲームでは試せません・・・
|
|
2007/5/16(Wed) 15:43:48|NO.8289
KIMUのスクリプトなんて分からなくてもいいよ。
異常なまでに読みにくいし。
|
|
2007/5/16(Wed) 18:10:13|NO.8292
お前勇気ありすぎwwwなまじプログラムが書ける上級者と思って言えなかったことをwww
まぁあれじゃねぇの簡単すぎて答えにならないように配慮してるんだろ。
|
|
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の具体的なサンプルは一つも見つからなかった)
| |
|
2007/6/5(Tue) 19:49:53|NO.8777
SendInputの使い方を探していたら、
めちゃくちゃわかりやすい例があるじゃないですか!
他に例が無くて困ってました
>検索で HSP keybd_event なら色々出てくるけど
>HSP SendInput だと全然無いんだねぇ・・・
>(HSPの具体的なサンプルは一つも見つからなかった)
KIMUさん纏めありがとうございます
|
|
2007/7/7(Sat) 02:28:49|NO.9302
age
|
|