05.スクリプトエディタを使用せずにコンパイル+実行 (要hspcmp.dll)
06.スクリプトエディタを使用せずにEXE作成 (要hspcmp.dll)
11.タスクの占有をさせないawait (要llmod.as)
14.変数情報を知るモジュール (要llmod.as)
16.ノートパソコン用バッテリ情報取得モジュール (要llmod.as)
17.マウスボタン機能左右入れ替え (要llmod.as)
18.コンピューター名取得・設定 (要llmod.as)
19.マウス移動範囲の限定モジュール (要llmod.as)
20.パソコンを起動してからの経過時間を取得するモジュール (要llmod.as)
21.ダブルクリック速度取得モジュールを使用して実際に検知してみる (要llmod.as)
22.ユーザー名を取得するモジュール (要llmod.as)
23.プログラムエラーダイアログを表示するモジュール (要llmod.as)
25.マウスポインタ位置から目的ポイントに向けて点を移動する
01.作成したEXE,SCRのアイコンを変更する
スクリプトエディタで作成されたEXE,SCRのアイコンは「カップ」になります。
せっかくオリジナルで作ったものですのでアイコンもオリジナルにしたいですよね。
国内最大級のダウンロードサイト「ベクター」にアイコン変更ソフトが多数登録されています。
私も「SatoIconChanger」と言う名のアイコン変更ソフトを公開しています。
1度コチラをお試しください。
02.ラベルに「@」を使う
リファレンスに書かれているのですが、隅まで読んでいない方は知らないかも・・・。
ラベル名に悩んだことはありませんか?
「@」というラベル特殊で、スクリプト内に複数作ることが出来るのです。
gotoやgosubで@ラベルへ飛ばすときの記述も他のラベルと少し違いまして、
「*@before」でこのジャンプ命令より上に書かれた@」ラベルのうち、一番近いラベルにジャンプします。
「*@forward」でジャンプ命令より下に書かれて一番近い「@」ラベルにジャンプします。
また「*@before」は「*@b」と、「*@forward」は「*@f」とそれぞれ省略することも可能です。
ただあまり多用し過ぎると返って混乱してしまうのでほどほどにしましょう。
(例)@ラベルを使う
*@
pos 0, 0 : button "next1",*@f
stop
*@
clrobj stat+1 ; 重複作成防止のため、押されたボタンのID+1を削除。ここでは「next2」と書かれたボタン
pos 0,25 : button "next2",*@f
stop
*@
clrobj stat+1
pos 0,50 : button "end",*@f
stop
*@
end
また「abc@」のように変数名の終端につけるとグローバルなスコープの変数となり
モジュール内外であってもその変数値を扱うことができる用になります。
同じ様に「aplact@」のように命令名の終端につけると
モジュール外で結合されたDLL(厳密にはAS)の命令であっても使用できるようになります。
03.リファレンスに載っていないキーコード取得
リファレンスのgetkeyの所にキーコードが載っていますが、
「NumLock」「半角/全角」「変換」などといった特殊なキーは載っていません。
HSPver2.55からonkey命令と言うのが加わり、キーボードのいずれかのキーを押したとき、
あらかじめ指定しておいたラベルにジャンプさせることが出来ます。
また、この時にシステム変数「iparam」にgetkeyと同じキーコードが代入されます。
(例)キーコードを表示する
onkey *key ; いずれかのキーが押されるとジャンプする
onclick *key ; いずれかのマウスボタンを押されるとジャンプする
stop
*key
mes "キーコード「"+iparam+"」が押されました"
stop
04.WIndowsを終了・再起動する
Windowsは終了する時にrundll.exeを呼び出して終了します。
windowsフォルダに入っていますが、実行してもうんともすんとも言いません。
ただ実行させるだけでは動いてくれないようです。
コマンドラインを送ることでそれにあった処理を行ってくれます。
コレを実現するにはexec命令でコマンドライン付きで実行します。(NT系ではこの方法・sysexit命令ではできません)
(例)Windows終了
dialog "Windowsを終了してよろしいですか?",3
if stat==7 : end
exec "rundll.exe user.exe,exitwindows"
end
(例)Windows再起動
dialog "Windowsを再起動してよろしいですか?",3
if stat==7 : end
exec "rundll.exe user.exe,exitwindowsexec"
end
05.スクリプトエディタを使用せずにコンパイル+実行 (要hspcmp.dll)
自作のエディターを作成している方で「HSPのソースを実行したい」という方がいらっしゃるかもしれません。
コンパイル+実行する命令はリファレンスには載っていません。
「docs」フォルダ内の「hspcmp.txt」に書かれています。詳しくはソチラをご覧ください。
1つ気をつける点は、hspcmp.dllは単体で配布できません。
HSP開発セット全体でならできるようです。
(例)コンパイル+実行
#include "hspcmp.as"
hsc_ini "実行したいasファイルのパス" ; 選んだファイルをコンパイル対象に設定
hsc_objname "hsp.ax" ; 作成するAXファイルの名前を"hsp.ax"に設定
hsc_comp 1 ; オブジェクトファイル作成(0はEXE作成時に使う)
run "hsp.ax" ; 実行する
06.スクリプトエディタを使用せずにEXE作成 (要hspcmp.dll)
自作エディターで「exeファイルまで作成したい」という方がいらっしゃるかもしれません。
packfileに何を入れて、ランタイムは何を使うという設定は面倒です。
ココではpackfileにstart.axだけを入れた普通の作成方法を説明します。
「docs」フォルダ内の「hspcmp.txt」に書かれています。詳しくはソチラをご覧ください。
1つ気をつける点は、hspcmp.dllは単体で配布できません。
HSP開発セット全体でならできるようです。
(例)exeファイル作成
#include "hspcmp.as"
dialog"as",16
if stat==0 : end
name=refstr
strlen len,name
strmid name,name,0,len-3
hsc_ini ""+name+".as"
hsc_objname "start.ax"
hsc_comp 0 ; start.ax作成
pack="start.ax"
strlen len,pack
bsave "packfile",pack,len ; packfile作成
pack_ini name
pack_make ; dpm作成
pack_exe 0 ; exe作成
07.ドラッグアンドドロップに対応させる
ダイアログを使って開くのではなく使用したいファイルを
直接ドラッグアンドドロップ(以下D&D)して開きたい場合、現時点で2種類の方法があります。
作成したEXEアイコンにD&Dで開く場合はシステム変数cmdlineを使用することで開くことができます。
実行中のウィンドウにD&Dして開く場合はHSP標準命令だけでは実現できませんので、
D&Dに対応した拡張プラグイン(DLL)をインクルードして実現することとなります。
対応したDLLはいくつもあります。(loadlib.dll、srexhsp.dll、exforce.dllなど)
(例)D&Dのみ開ける簡易画像ビューワー
gsel 0,-1 ; EXE作成時に「ウィンドウを隠す」にしてもよい
buffer 2
if cmdline="" : dialog "ドラッグアンドドロップで画像ファイルを開いてください" :
stop
file=cmdline ; 次のgetstrでcmdlineは代入できないため変数に入れておく
getstr file,file,0,' '
exist file
if strsize<0 : dialog "半角スペースを含むファイルは表示できません" : stop
skiperr 1
picload file
if err : dialog "jpg,bmp,mag形式の画像ファイルのみ表示できます" : stop
skiperr 0
screen 2
title "画像ビューワー(終了はALT+F4)"
picload file,0,640,480
stop
08.スタートメニューを開く
スタートメニューを(WINDOWSロゴの入ったボタンを押して)起動したのと同じ効果をHSPで実現できます。
スタートメニューが開いているときにすると逆に閉じることができます。
書式は「objsend -28,$112,$f130,0,1」です。
(例)スタートメニューの開閉
a=0
title "スタートメニューを開く"
objsend -28,$112,$f130,a,1 ; このobjsend命令がミソ。IDを-28にすること
wait 100
title "スタートメニューを閉じる"
objsend -28,$112,$f130,a,1
stop
09.Windowsをログオフする
06に書いていなかったログオフの方法を2種類書いておきます。
下はloadlib.dllを使用しますがWindowsNT系でも問題なく実行することができます。
(例)ログオフをする - その壱 -
dialog"ログオフしますか?",3
if stat==7 : end
exec "rundll32.exe shell32.dll,SHExitWindowsEx 0"
end
(例)ログオフをする - その弐 - (sprocketさん提供,要loadlib.dll)
#include "llmod.as"
p=0
dllproc "ExitWindowsEx",p,1,D_USER
end
10.フラグ用のサイズを極限まで小さくする
同じようなもののフラグは皆さんどのように取っているでしょう?
変数に一つ一つ入れていっていませんか?dimでサイズを小さくしていない方はものすごく無駄遣いしていますね
そのままのサイズで10個フラグを使用すれば10(個)*4(バイト)*16(配列の要素)で640バイトも使用してしまいます。
配列変数でしている方はまだ上よりかはマシですが10個で40バイトも使用しています。
コレ以上小さくするにはどうすればよいでしょう?2進法を利用すれば大分小さくなりますね?
HSPでは1つの数値型変数で4バイト(-2147483668〜2147483667まで扱える)使用していますので、
31個のフラグがたった4バイトで判定することができてしまいます。
1. 1 1<<0
2. 2 1<<1
3. 4 1<<2
4. 8 1<<3
5. 16 1<<4
6. 32 1<<5
7. 64 1<<6
8. 128 1<<7
9. 256 1<<8
10. 512 1<<9
11. 1024 1<<10
12. 2048 1<<11
13. 4096 1<<12
14. 8192 1<<13
15. 16384 1<<14
16. 32768 1<<15
17. 65526 1<<16
18. 131072 1<<17
19. 262144 1<<18
20. 524288 1<<19
21. 1048576 1<<20
22. 2097152 1<<21
23. 4194304 1<<22
24. 8388608 1<<23
25. 16777216 1<<24
26. 33554432 1<<25
27. 67108864 1<<26
28. 134217728 1<<27
29. 268435456 1<<28
30. 536870912 1<<29
31.1073741824 1<<30 フラグに使える数値一覧
サッパリわからない方のために説明しておくと、例えば上の1,2,3,4をすべて足すと15になりますね。
15になるのは1,2,3,4を足した時にしかならないので1,2,3,4だけフラグが立っているとわかるわけです。
注)ココでいうフラグはON,OFFの2通りの「スイッチ」を指します。2通り以外の場合は使用できません
(例)フラグデータの読み書き
dim flg,31
sdim msg,9,31
msg ="フラグ01","フラグ02","フラグ03","フラグ04","フラグ05","フラグ06","フラグ07","フラグ08","フラグ09","フラグ10"
msg.10="フラグ11","フラグ12","フラグ13","フラグ14","フラグ15","フラグ16","フラグ17","フラグ18","フラグ19","フラグ20"
msg.20="フラグ21","フラグ22","フラグ23","フラグ24","フラグ25","フラグ26","フラグ27","フラグ28","フラグ29","フラグ30","フラグ31"
objsize 100,25
pos 5,5 : button "読み込み",load
pos 5,40 : button "保存",save
repeat 31
pos cnt/15*150+200,cnt\15*30+5 : chkbox msg.cnt,flg.cnt
loop
stop
*load
bload "flgtest.txt",data
int data
num=1
repeat 31
if data & num : flg.cnt=1 : else : flg.cnt=0
num=num*2
objprm cnt+2,flg.cnt
loop
stop
*save
data=0
num=1
repeat 31
data+=num*flg.cnt
num=num*2
loop
str data
strlen len,data
bsave "flgtest.txt",data,len
stop
上記サンプル例のように保存する場合1文字1バイトですのでこの方法を使っても最大10バイト(文字数)いってしまいます。
31個で10バイトは小さいですけどコレ以上に小さくできる方法が存在します。
それはpeek,pokeを使う方法です。どういうことかと言うと、
文字は1ビットごとに違いますよね。0〜255の8個しか使えませんが1バイトで8個使えるのはすごいですね。
この方法だと4バイト(1文字1バイトなので4文字)で32個、2進法だと4バイトで32個と両方同じ数ですけど保存する場合、
この方法だと32個の保存に必要なのは4バイト、2進法だと32個保存するのに数値の桁分いるので最大10バイトいるのです。
この方法以上に小さくできる方法をご存知の方、是非教えてください。
dim flg,8
sdim msg,9,8
msg ="フラグ01","フラグ02","フラグ03","フラグ04","フラグ05","フラグ06","フラグ07","フラグ08"
objsize 100,25
pos 5,5 : button "読み込み",load
pos 5,40 : button "保存",save
repeat 8
pos 200,cnt*30+10 : chkbox msg.cnt,flg.cnt
loop
stop
*load
bload "flgtest2.txt",data
peek data,data,0
num=1
repeat 8
if data & num : flg.cnt=1 : else : flg.cnt=0
num=num*2
objprm cnt+2,flg.cnt
loop
stop
*save
data=0
num=1
repeat 8
data+=num*flg.cnt
num=num*2
loop
poke data,0,data
bsave "flgtest2.txt",data,1
stop
11.タスクの占有をさせないawait (要loadlib.dll)
awaitはタスクを占有しCPU使用率を常に100%としてしまいます。
waitは100%にはならないのですが、10ms以下の時間だけウェイトさせたい場合があると思います。
注.現在のバージョン2.6ではパラメータが追加されてCPU使用率を100%でなくせるようになりましたので無意味です。
(例)ウェイト例
#include "llmod.as"
repeat
await
prm=1
dllproc "Sleep",prm,1,D_KERNEL
loop
12.マウスカーソルを震えさせる
特に意味はありませんが、マウスカーソルを小刻みに震えさせてみましょう(笑
(例)10秒間マウスを放っておくと勝手に震え出し揺れが段々大きくなる
repeat
ginfo 0
if mx=prmx&(my=prmy) : count+ : else : count=0
mx=prmx : my=prmy
yure=count/1000
if yure=0 : title ""
repeat yure
title "震度"+yure+"の揺れ(笑" : if count\2=0 : mx- : else : mx+
loop
mouse mx,my
wait 1
loop
15.時間計測モジュール
swstartで計測開始、swprogressで途中経過表示用、swstopで計測終了です。
使用する配列変数は桁そろえが必要なため文字列型の変数(3文字以上入る要素5以上)を用意してください。
gettimeで計測しているのでパソコンによる誤差はありません。
●〜▲までのかかった処理時間を調べたい時等にご利用ください。
日までの計算はしていますが月計算はしていないので違う月を指定しても日数は変わりませんし、
現在より日が古いと年月に関係なくマイナス値となります。
(例)ストップウォッチ
;******************* 概要説明 **********************
;
; swstart p1
;
; p1=文字列型配列変数 : 開始時刻を入れる配列変数
;
; swprogress p1,p2
;
; p1=文字列型配列変数 : 開始時に使用した配列変数
; p2=文字列型配列変数 : 表示等させるための別の配列変数
;
; swstop p1
;
; p1=文字列型配列変数 : 開始時に使用した配列変数
;
;***************************************************
#module "select"
dim arrange,5
#deffunc swstart val
mref p1,56
repeat 5
tmp=0 ; 数値化しなければ文字列型の場合gettimeが使用できない
gettime tmp,cnt+3
str tmp,cnt/4+2
p1.cnt=tmp
loop
return
#deffunc swprogress val,val
mref p1,56
mref p2,57
repeat 5
gettime arrange.cnt,cnt+3
tmp=p1.cnt
int tmp
arrange.cnt=arrange.cnt-tmp
loop
if arrange.4<0 : arrange.4=1000+arrange.4 : arrange.3-
if arrange.3<0 : arrange.3=60+arrange.3 : arrange.2-
if arrange.2<0 : arrange.2=60+arrange.2 : arrange.1-
if arrange.1<0 : arrange.1=24+arrange.1 : arrange.0-
repeat 5
tmp=arrange.cnt
str tmp,cnt/4+2
p2.cnt=tmp
loop
return
#deffunc swstop val
mref p1,56
tmp=0
repeat 5
gettime arrange.cnt,cnt+3
tmp=p1.cnt
int tmp
arrange.cnt=arrange.cnt-tmp
loop
if arrange.4<0 : arrange.4=1000+arrange.4 : arrange.3-
if arrange.3<0 : arrange.3=60+arrange.3 : arrange.2-
if arrange.2<0 : arrange.2=60+arrange.2 : arrange.1-
if arrange.1<0 : arrange.1=24+arrange.1 : arrange.0-
repeat 5
tmp=arrange.cnt
str tmp,cnt/4+2
p1.cnt=tmp
loop
return
#global ; ***** ここまでがモジュール ここから下がサンプル *****
sdim time,4,5
sdim progress,4,5
font "",20,1
objsize 80,20
button"スタート",st
button"ストップ",fin
stop
*st
swstart time
repeat
redraw 0
color 255,255,255 : boxf : color
swprogress time,progress
pos 100,100 : mes ""+progress.1+"時間"+progress.2+"分"+progress.3+"."+progress.4+"秒"
redraw
wait 1
loop
*fin
swstop time
redraw 0
color 255,255,255 : boxf : color
pos 100,100 : mes ""+time.1+"時間"+time.2+"分"+time.3+"."+time.4+"秒"
redraw
stop
14.変数の情報を知るモジュール HSP2.6以上
作成するソフト等には直接関係しないものとなりますので必要ないと思われますが私自身昔よく使用していましたので。
スクリプト内のとある変数のサイズを知る必要ができた時等にご利用ください。
一応dirlistの自動サイズ変更機能を使用していますのでHSPver2.6以上でご利用ください。
どちらもシステム変数statに結果が返ります。配列変数をsizechkで調べると1次元目のサイズが出てきます。
(例)変数情報取得
;************ 概要説明 *************
;
; sizechk p1
;
; p1=変数 : 数値型・文字列型どちらでも良い
;
; dimention p1
;
; p1=配列変数 : 数値型・文字列型どちらでも良い
;
;**********************************
#module "varinfo"
#deffunc sizechk val
mref pval2,1024
mref stt,64
if pval2.0=2 : stt=pval2.2*4 : else : stt=pval2.2 ; sdimの場合は4倍する
return
#deffunc dimension val
mref pval2,1024
mref stt,64
stt=0
repeat
tmp=2+cnt
num=pval2.tmp
if num : stt+ : else : break
wait 1
loop
return
#global ; ***** ここまでがモジュール ここから下がサンプル *****
sdim buf,32000,2
sdim buf,128
sizechk buf
mes "bufのサイズ : "+stat+" バイト"
chdir "c:\\windows\\system32"
dirlist buf,"*.*";,1
sizechk buf
mes "bufのサイズ : "+stat+" バイト"
dim num,12,5,7
sizechk num ; 1次元目のサイズ
mes "numのサイズ : "+stat+" バイト"
dimension num
mes "次元数 : "+stat
stop
15.トランプのシャッフル
トランプなどのカードゲームで配りなおすときにシャッフルしますよね?
HSP初めて間もない人はココで結構躓いてしまうところかと思いますので参考までに載せておきます。
シャッフルする時に同じカードがかぶらないように文字列編06の方法を使用しています。
1行に入り切らなかった所があるのでその部分だけ文字サイズをいつもより小さくしています。
(例)シャッフル
sdim
card,10,52
sdim stock,10,5
dim chk,52
kind="ハート"
num="A"
repeat 52
if cnt=13 : kind="ダイヤ"
if cnt=26 : kind="スペード"
if cnt=39 : kind="クラブ"
card.cnt=""+kind+""+num
pos cnt\4*160,cnt/4*20 : mes card.cnt ; すべてのカード表示
if num="A" : num=2 : else : if num=10 : num="J" : else : if num="J" : num="Q" : else : if num="Q" : num="K" : else : if num="K" : num="A" : else : num+
loop
randomize
objsize 100,25
pos 540,455 : button "シャッフル",shuffle
stop
*shuffle
repeat 52
chk.cnt=0
loop
repeat 5
rnd rand,52
if chk.rand : continue cnt ; 既に出たカードならやり直し
chk.rand=1
stock.cnt=card.rand
await 0 ; 念のためタスクを回す(この程度じゃなくても構わない)
loop
color 255,255,255 : boxf 0,350,640,480: color
repeat 5
pos 100,cnt*20+350 : mes stock.cnt
loop
stop
16.ノートパソコン用バッテリ情報取得モジュール HSP2.6以上
デスクトップ型には無縁のTIPSです。
モバイルパソコンの電源についての情報を取得するモジュールです。
一応>命令を使用していますのでHSPver2.6以上でご利用ください。
(例)変数情報取得
#include "llmod.as"
;************ 概要説明 *************
;
; pstatus v1
;
; v1=数値型配列変数 : 情報を代入する要素数3以上の配列
; 戻り値 v1.0 : ACパワーの状態(0=オフライン,1=オンライン,255=不明)
; v1.1 : バッテリチャージの状態(1=高い,2=低い,4=危険,8=チャージ中,128=バッテリなし,255=不明)
; v1.2 : バッテリ残量(0〜100%,255=不明)
; v1.3 : バッテリ残り秒数(-1=不明)
; v1.4 : フルチャージ時の残り秒数(-1=不明)
;
;**********************************
#module "power"
#deffunc pstatus val
mref status,48
getptr prm,status
dllproc "GetSystemPowerStatus",prm,1,D_KERNEL
status.4=status.2
status.3=status.1
status.2=status >> 16 & $ff
status.1=status >> 8 & $ff
status.0=status & $ff
return
#global ; ***** ここまでがモジュール ここから下がサンプル *****
dim time,3
dim info,5
repeat
gosub *powercheck
wait 100
loop
*powercheck
redraw 0
color 255,255,255 : boxf : color
pstatus info
pos 100,50 : mes "AC接続状況"
pos 320,50
switch info.0
case 0 : mes "オフライン" : swbreak
case 1 : mes "オンライン" : swbreak
case 255 : mes "不明"
swend
pos 100,100 : mes "充電ステータス"
pos 320,100
if info.1&1 : mes "高い"
if info.1&2 : mes "低い"
if info.1&4 : mes "危険"
if info.1&8 : mes "チャージ中"
if info.1&128 : mes "バッテリなし"
if info.1=255 : mes "不明"
pos 100,150 : mes "バッテリ残量"
pos 320,150
switch info.2
case 255 : mes "不明" : swbreak
default : mes ""+info.2+"%"
swend
pos 100,200 : mes "残り使用可能時間"
pos 320,200
switch info.3
case -1 : mes "不明" : swbreak
default : time.0=info.3/3600 : time.1=info.3\3600/60 : time.2=info.3\60
mes ""+time+"時間"+time.1+"分"+time.2+"秒"
swend
pos 100,250 : mes "フル充電時の使用可能時間"
pos 320,250
switch info.4
case -1 : mes "不明" : swbreak
default : time.0=info.4/3600 : time.1=info.4\3600/60 : time.2=info.4\60
mes ""+time+"時間"+time.1+"分"+time.2+"秒"
swend
redraw
return
17.マウスボタン機能左右入れ替え HSP2.6以上
コントロールパネルから設定できるアレです。ぶっちゃけ需要は全くないでしょうね。
当然HSPを終了しても持続したままです。パラメータを変更して再実行するかコントロールパネルで修正をしてください。
(例)変数情報取得
#include "llmod.as"
;************************** 概要説明 ************************
;
; mexchg n1
;
; n1=数値 : 処理(0=元に戻す,1=機能入れ替え)
;
;***********************************************************
#module "mouse"
#deffunc mexchg int
mref type,0
if type : type=1
dllproc "SwapMouseButton",type,1,D_USER@
return
#global ; ***** ここまでがモジュール ここから下がサンプル *****
mexchg 1
18.コンピューター名取得・設定 HSP2.6以上
コンピュータ名の取得や設定をするモジュールです。
このモジュールでの設定はコンピュータの管理権限を取得していないためNT系では出来ません。
また設定に成功しても再起動しなければ反映しません。正常終了でstatに0が、失敗で1が入ります。
(例)コンピュータ名を取得
#include "llmod.as"
;************************** 概要説明 ************************
;
; getcname v1 setcname v1
;
; v1=文字列型変数 : 情報を代入する変数 v1=文字列型変数 : 設定する文字列の入った変数
;
;***********************************************************
#module "system"
#deffunc getcname val
mref lpbuffer,24
mref stt,64
mref pval2,1024
getptr prm.0,lpbuffer
prm.1=pval2.2*4
getptr prm.1,prm.1
dllproc "GetComputerNameA",prm,2,D_KERNEL@
if dllret@ : stt=0 : else : stt=1
return
#deffunc setcname val
mref lpcomputername,24
mref stt,64
getptr prm,lpcomputername
dllproc "SetComputerNameA",prm,1,D_KERNEL@
if dllret@ : stt=0 : else : stt=1
return
#global ; ***** ここまでがモジュール ここから下がサンプル *****
sdim computername,128
getcname computername
if stat : dialog"取得失敗" : else : mes computername
stop
19.マウス移動範囲の限定モジュール HSP2.6以上
マウスを動かせる範囲を指定するモジュールです。
範囲の形は四角形で左端・右端・上端・下端の4隅を渡します。
ウィンドウ内の座標ではなく絶対座標なので起動させたHSPウィンドウ内の一部だけを動かせる範囲とする場合、
ginfo命令を使用してあらかじめウィンドウ位置・サイズを割り出しておいてください。
正常終了でstatに0が、失敗で1が入ります。
(例)範囲を限定する
#include "llmod.as"
;************************** 概要説明 ************************
;
; limit n1,n2,n3,n4,n5
;
; n1=数値 : 範囲制限フラグ(0:解除 , 1:制限)
; n2=数値 : 範囲左端
; n3=数値 : 範囲右端
; n4=数値 : 範囲上端
; n5=数値 : 範囲下端
;
;***********************************************************
#module "mouse"
#deffunc limit int,int,int,int,int
mref ctrl,0
mref left,1
mref top,2
mref right,3
mref bottom,4
mref stt,64
if ctrl=0 {
prm=0
} else {
range=left,top,right,bottom
getptr prm,range
}
dllproc "ClipCursor",prm,1,D_USER@
stt=1-dllret@
return
#global ; ***** ここまでがモジュール ここから下がサンプル *****
gsel 0,-1
bgscr 2,dispx,dispy
wait 10 ; ウェイトがないと範囲指定が効かない?
color 255 : boxf 100,50,300,200 : color 255,255,255
pos 170,110 : mes "移動範囲"
limit 1,100,50,300,200
wait 500
limit 0
end
20.パソコンを起動してからの経過時間を取得するモジュール HSP2.6以上
非常に簡単に取得できるものですが結構役立つものですので載せておきます。
このモジュールを使用するとシステム変数statに起動してからの経過時間がミリ秒単位で入ります。
2147483667までカウントすることができるので実質24日分は計測可能ということになります。
(例)パソコンの稼働時間取得
#include "llmod.as"
;************************** 概要説明 ************************
;
; tickcount
;
; 戻り値 : 起動してからの時間がミリ秒単位でstatに代入されます
;
;***********************************************************
#module "mouse"
#deffunc tickcount
mref stt,64
dllproc "GetTickCount",prm,0,D_KERNEL@
return
#global ; ***** ここまでがモジュール ここから下がサンプル *****
repeat
tickcount
redraw 0
color 255,255,255 : boxf : color
dd=stat/86400000
hh=stat/3600000\24
mm=stat/60000\60
ss=stat/1000\60
pos 0,0 : mes "パソコンを起動してから「"+dd+"日"+hh+"時間"+mm+"分"+ss+"秒」経ちました"
redraw
wait 10
loop
21.ダブルクリック速度取得モジュールを使用して実際に検知してみる HSP2.6以上
ダブルクリックは工夫すれば取得できるのですが、人により速度はバラバラに設定されています。
APIを利用したモジュールを使用して速度を取得し実際に検知してみましょう。
モジュールを使用するとシステム変数statにミリ秒単位のダブルクリック間隔が代入されます。
(例)ダブルクリックテスト
#include "llmod.as"
;************************** 概要説明 ************************
;
; wclick
;
; 戻り値 : ダブルクリック許容時間をミリ秒単位でstatに代入されます
;
;***********************************************************
#module "mouse"
#deffunc wclick
mref stt,64
dllproc "GetDoubleClickTime",prm,0,D_USER@
stt=dllret@
return
#global ; ***** ここまでがモジュール ここから下がサンプル *****
wclick
speed=stat
title "ダブルクリック間隔は"+speed+"ミリ秒です"
repeat
stick key,,1
if key&256 {
repeat speed/10
stick key,,1
if key&512 : break
if key&256 : dialog"ダブルクリックを検知しました" : break
wait 1
loop
}
wait 1
loop
22.ユーザー名を取得するモジュール HSP2.6以上
21でコンピューター名を取得するモジュールがありましたが、
ここではログインユーザー名を取得したいと思います。
正常終了でシステム変数statに0、失敗で1が代入されます。
(例)ユーザー名を表示
#include "llmod.as"
;************************** 概要説明 ************************
;
; getuname v1
;
; v1=文字列型変数 : 取得したユーザー名を代入する変数
; 戻り値 : 成功でstatに1,失敗で0が代入
;
;***********************************************************
#module "system"
#deffunc getuname val
mref uname,24
mref pval2,1024
mref stt,64
size=pval2.2*4
ll_libload@ adv,"advapi32.dll"
getptr prm.0,uname
getptr prm.1,size
dllproc "GetUserNameA",prm,2,adv
stt=1-dllret@
ll_libfree@ adv
return
#global ; ***** ここまでがモジュール ここから下がサンプル *****
sdim name,128
getuname name
mes name+"さんこんにちは"
stop
23.プログラムエラーダイアログを表示するモジュール HSP2.6以上
TIPSとして用途が不明なモジュールです。
システムエラー等でよく出現する画面のようですがXPで試した所、通常のダイアログとほぼ同じのが表示されました。
用途は…利用する方が決めてください。実行すると実際に終了してしまいます
(例)アプリケーションエラー
#include "llmod.as"
;************************** 概要説明 ************************
;
; errdlg s1
;
; s1=文字列型変数 : メッセージテキストに表示させる文字列
;
;***********************************************************
#module "dialog"
#deffunc errdlg str
mref msg,32
msgval=msg
prm=0
getptr prm.1,msgval
dllproc "FatalAppExitA",prm,2,D_KERNEL@
return
#global ; ***** ここまでがモジュール ここから下がサンプル *****
errdlg "hsp2.exeで致命的なエラーが発生しましたので終了します"
stop ; あってもなくても終了してしまうので意味がない
24.システム変数を書き換える
どこかに書いたはず、と思っていたのですが見当たらなかったのでココに書いておきます。
システム変数は通常の変数のように代入しようとしてもエラーが出てしまい代入出来ません。
しかしstatやrefstrは下記の方法で変更することが出来ます。
(例)書き換える
mref stt,64 ; stat
mref ref,65 ; refstr
stt=12345
ref="abcdefg"
mes "stat="+stat
mes "refstr="+refstr
stop
25.マウスポインタ位置から目的ポイントに向けて点を移動する
当掲示板であった質問分です。
シューティングで敵から現在の自分の位置(又は自分から敵)を目掛けて弾を発射するには、
どの方角にどれだけずつ動かしていけば目的目掛けて動いていくように見えるかというものですが、
あんすこえむさんが外部プラグインを使用せず、標準命令のみで実現されたものを載せておきます。
カーソル位置から標的に向けて弾を発射する(あんすこえむさん提供)
#const bnum 100 ; 弾を同時制御する数
#const sp 3 ; 移動量倍率(ドット数相当)
dim bx,bnum ; 弾のX座標(下駄を10bit履く)
dim by,bnum ; 弾のY座標(下駄を10bit履く)
dim bdx,bnum ; 弾のX方向速度(下駄を10bit履く)
dim bdy,bnum ; 弾のY方向速度(下駄を10bit履く)
dim bs,bnum ; 弾の寿命
screen 0,640,400,1
xt=320 : yt=200 ; ターゲットの位置
bt=0 ; 新規発射対象となる弾のID
*main
redraw 1 : redraw 0 : await 20 ; 画面更新とwait
stick ky,,1 ; キー情報を得る
mx=mousex : my=mousey ; マウスポインタ位置情報を得る
if ky&512 : xt=mx : yt=my ; ターゲット移動
if ky&511 { ; 発射すべきなら
dx=xt-mx : dy=yt-my ; ターゲットと発射点の間の、X差分、Y差分を求める。
d2=((dx*dx)+(dy*dy))<<10 ; 処理の2乗を求める。(精度確保のため10bitの下駄を履く)
ds=0
repeat 16
du=15-cnt
ds+=1<<du
ds-=ds*ds>d2<<du
loop
;↑距離ds=√d2 を求める。1/2乗されたので、d2の下駄10bitはdsでは1/2の5bitとなる。
if ds { ; 距離ds=0でなければ、新規に弾を生成
bdx.bt=dx*sp<<15/ds ; X方向速度を求める。dsの下駄を考慮
bdy.bt=dy*sp<<15/ds ; Y方向速度を求める。dsの下駄を考慮
bx.bt=mx<<10:by.bt=my<<10 ; 弾初期位置を設定
bs.bt=300 ; 寿命を設定
bt=bt+1\bnum ; 弾のIDを更新。0〜bnum-1をサイクリックに使用。
}
}
palcolor 0:boxf ;画面クリア
palcolor 249:boxf xt-1,yt-1,xt+1,yt+1 ;ターゲット描画
palcolor 255
repeat bnum ;寿命の残っている弾をすべて描画するループ
if bs.cnt { ;寿命が残っていれば
bs.cnt-- ; 寿命減らす
bx.cnt+=bdx.cnt:by.cnt+=bdy.cnt ; 弾移動
pset bx.cnt>>10,by.cnt>>10 ; 下駄を外して弾を描画
}
loop
goto *main