〜 その他 〜

01.作成したEXE,SCRのアイコンを変更する

02.ラベルに「@」を使う

03.リファレンスに載っていないキーコード取得

04.WIndowsを終了・再起動する

05.スクリプトエディタを使用せずにコンパイル+実行 (要hspcmp.dll)

06.スクリプトエディタを使用せずにEXE作成 (要hspcmp.dll)

07.ドラッグアンドドロップに対応させる

08.スタートメニューを開く

09.Windowsをログオフする

10.フラグ用のサイズを極限まで小さくする

11.タスクの占有をさせないawait (要llmod.as)

12.マウスカーソルを震えさせる

13.時間計測モジュール

14.変数情報を知るモジュール (要llmod.as)

15.トランプのシャッフル

16.ノートパソコン用バッテリ情報取得モジュール (要llmod.as)

17.マウスボタン機能左右入れ替え (要llmod.as)

18.コンピューター名取得・設定 (要llmod.as)

19.マウス移動範囲の限定モジュール (要llmod.as)

20.パソコンを起動してからの経過時間を取得するモジュール (要llmod.as)

21.ダブルクリック速度取得モジュールを使用して実際に検知してみる (要llmod.as)

22.ユーザー名を取得するモジュール (要llmod.as)

23.プログラムエラーダイアログを表示するモジュール (要llmod.as)

24.システム変数を書き換える

25.マウスポインタ位置から目的ポイントに向けて点を移動する


01.作成したEXE,SCRのアイコンを変更する

  スクリプトエディタで作成されたEXE,SCRのアイコンは「カップ」になります。
  せっかくオリジナルで作ったものですのでアイコンもオリジナルにしたいですよね。
  国内最大級のダウンロードサイト「ベクター」にアイコン変更ソフトが多数登録されています。
  私も「SatoIconChanger」と言う名のアイコン変更ソフトを公開しています。
  1度コチラをお試しください。

 TOPへ戻る

02.ラベルに「@」を使う

  リファレンスに書かれているのですが、隅まで読んでいない方は知らないかも・・・。
  ラベル名に悩んだことはありませんか?
  「@」というラベル特殊で、スクリプト内に複数作ることが出来るのです。
  gotogosubで@ラベルへ飛ばすときの記述も他のラベルと少し違いまして、
  「*@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)の命令であっても使用できるようになります。

TOPへ戻る

03.リファレンスに載っていないキーコード取得

  リファレンスのgetkeyの所にキーコードが載っていますが、
  「NumLock」「半角/全角」「変換」などといった特殊なキーは載っていません。
  HSPver2.55からonkey命令と言うのが加わり、キーボードのいずれかのキーを押したとき、
  あらかじめ指定しておいたラベルにジャンプさせることが出来ます。
  また、この時にシステム変数「iparam」にgetkeyと同じキーコードが代入されます。

  (例)キーコードを表示する

 onkey *key ; いずれかのキーが押されるとジャンプする
 onclick *key ; いずれかのマウスボタンを押されるとジャンプする
 stop

*key
 mes "キーコード「"+iparam+"」が押されました"
 stop

TOPへ戻る

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

TOPへ戻る

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" ; 実行する

TOPへ戻る

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作成

TOPへ戻る

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

TOPへ戻る

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

TOPへ戻る

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

TOPへ戻る

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

TOPへ戻る

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

TOPへ戻る

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

TOPへ戻る

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

TOPへ戻る

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

TOPへ戻る

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

TOPへ戻る

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

TOPへ戻る

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

TOPへ戻る

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

TOPへ戻る

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

TOPへ戻る

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

TOPへ戻る

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

TOPへ戻る

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

TOPへ戻る

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 ; あってもなくても終了してしまうので意味がない

TOPへ戻る

24.システム変数を書き換える

  どこかに書いたはず、と思っていたのですが見当たらなかったのでココに書いておきます。
  システム変数は通常の変数のように代入しようとしてもエラーが出てしまい代入出来ません。
  しかしstatrefstrは下記の方法で変更することが出来ます。

  (例)書き換える

 mref stt,64 ; stat
 mref ref,65 ; refstr
 stt=12345
 ref="abcdefg"
 mes "stat="+stat
 mes "refstr="+refstr
 stop

TOPへ戻る

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

TOPへ戻る