|
|
|
2020/5/25(Mon) 20:24:10|NO.90635
HSP標準デバッグウィンドウの状態(タブの選択インデックスや、変数タブのチェックボックスのチェック状態)を終了時に保存し、
デバッグウィンドウが再度起動時されたときに、前回と同じ状態にするものを作成しました。
これで、起動するたびに、変数タブのチェックボックスにチェックを入れたりする必要がなくなります。
▽使用方法
下のスクリプトを"KeepDebugWindowStatus.hsp"などの名前で保存し、
自分のスクリプトなどの先頭に、保存したファイルを#includeすることで、#includeしたスクリプト限定で使用できます。
また、HSPのインストールフォルダ内のcommonフォルダに"userdef.as"というファイルを作成し、
このファイルの中で保存したファイルを#includeすることで、全てのスクリプトで#includeなしで使用できるようになります。
("userdef.as"が既にある場合は、追記する形にしてください)
※状態が保存されたファイル"DebugWindowStatus.ini"は、HSPのインストールフォルダ内に作成されます。
良ければ、感想お願いします。
バグ報告、要望も受け付けます。
// デバッグウィンドウの状態を保持する
#ifdef _debug
#ifndef __KeepDebugWindowStatus__
#define global __KeepDebugWindowStatus__
#define global _StatusFilePath dir_exe+"\\DebugWindowStatus.ini" // 状態を保存するファイルのパス (HSPインストールフォルダに)
#include "mod_regexp.as"
#module _GetStatus
// ファイルの内容を変数に読み込む
#deffunc LoadStatusFile
sdim sFile
exist _StatusFilePath
if strsize!=-1{
sdim sFile,strsize
notesel sFile
noteload _StatusFilePath
}
return
// 読み込んだ内容から、指定されたキー名の数値を取り出す
#defcfunc GetStatus str keyName, int nDefault
dim ret
sdim sStat
sStat = submatch(sFile, "^\\s*"+keyName+"\\s*=\\s*(-?\\d+)"); "キー名="の後の数値を取り出す
if sStat == "" {
ret = nDefault
}else{
ret = int(sStat)
}
return ret
#global
#module _LoadAndSaveDebugWindowStatus
#uselib "user32.dll"
#func GetWindowThreadProcessId "GetWindowThreadProcessId" sptr,sptr
#func GetDesktopWindow "GetDesktopWindow"
#func GetTopWindow "GetTopWindow" sptr
#func GetWindow "GetWindow" sptr,sptr
#func GetWindowText "GetWindowTextA" sptr,sptr,sptr
#func GetClassName "GetClassNameA" sptr,sptr,sptr
#func FindWindowEx "FindWindowExA" sptr,sptr,sptr,sptr
#func GetWindowLong "GetWindowLongA" sptr,sptr
#define GW_HWNDNEXT $00000002
#define TCM_SETCURSEL $0000130C
#define WM_NOTIFY $0000004E
#define TCN_SELCHANGING $FFFFFDD8
#define GWL_ID $FFFFFFF4
#define BM_SETCHECK $000000F1
#define WM_COMMAND $00000111
#define TCM_GETCURSEL $0000130B
#define BM_GETCHECK $000000F0
// ファイルから状態を読み込んで復帰させる
#deffunc LoadDebugWindowStatusFromFile
// 自分のデバッグウィンドウを探す
dim isExistDebugWindow
isExistDebugWindow = 1
; 自分のプロセスID取得
dim ownPId
GetWindowThreadProcessId hwnd, varptr(ownPId)
; 一番上のウィンドウから下へ順に探す
dim hDebugWindow
dim hTgt : dim tgtPId : sdim tgtTitle,256 : sdim tgtClassName,256
hTgt = GetTopWindow( GetDesktopWindow() )
repeat
hTgt = GetWindow(hTgt,GW_HWNDNEXT)
if hTgt {
// プロセスIDが自分と同じ
GetWindowThreadProcessId hTgt, varptr(tgtPId)
if tgtPId==ownPId{
// ウィンドウタイトルが"Debug Window"
GetWindowText hTgt, varptr(tgtTitle), 256
if tgtTitle=="Debug Window"{
// クラス名が"HSP3DEBUG"
GetClassName hTgt, varptr(tgtClassName), 256
if tgtClassName=="HSP3DEBUG"{
hDebugWindow = hTgt
break
}
}
}
} else : break
loop
if hDebugWindow == 0 : return
// タブの選択インデックス を復帰
; タブのハンドル取得
dim hTab
hTab = FindWindowEx(hDebugWindow, 0, "SysTabControl32", 0)
if hTab == 0 : isExistDebugWindow = 0
LoadStatusFile; ファイルを読み込み
; 選択インデックス設定
sendmsg hTab, TCM_SETCURSEL, GetStatus("SelectedTabIndex",0)
; タブが変更されたことを親ウィンドウに通知
dim NMHDR,3
NMHDR = hwnd, GetWindowLong(hTab,GWL_ID), TCN_SELCHANGING
sendmsg hDebugWindow, WM_NOTIFY, varptr(NMHDR)
// 変数タブのチェックボックスのチェック状態 を復帰
; タブ毎に親ウィンドウが違うみたいなので、変数タブの親ウィンドウのハンドルを取得
dim hParent
repeat 2
hParent = FindWindowEx(hDebugWindow, hParent, "#32770", 0)
loop
; チェックボックスのハンドル取得
dim hChkbox,4
dim chkboxNames,4 : dim keyNames,4
chkboxNames = "ソート", "モジュール", "配列変数", "メモリダンプ"
keyNames = "Sort", "Module", "ArrayVariable", "MemoryDump"
repeat 4
hChkbox(cnt) = FindWindowEx(hParent, 0, "Button", chkboxNames.cnt)
; チェック設定
isChk = GetStatus("Is"+keyNames.cnt, 0)
if isChk>1 : isChk=1
if isChk<0 : isChk=0
sendmsg hChkbox(cnt), BM_SETCHECK, isChk
; 親ウィンドウに通知
GetWindowLong hChkbox.cnt, GWL_ID
wp = (stat) & $FFFF | (BM_SETCHECK) << 16
sendmsg hParent, WM_COMMAND, wp, hChkbox.cnt
loop
return
// 状態をファイルに保存する
#deffunc SaveDebugWindowStatusToFile onexit
if isExistDebugWindow == 0 : return
sdim file,256
notesel file
// タブの選択されているインデックス
sendmsg hTab, TCM_GETCURSEL
noteadd strf("SelectedTabIndex=%d",stat)
// 変数タブのチェックボックスのチェック状態
keyNames = "Sort", "Module", "ArrayVariable", "MemoryDump"
repeat 4
sendmsg hChkbox(cnt),BM_GETCHECK
noteadd strf("Is%s=%d", keyNames.cnt, stat)
loop
notesave _StatusFilePath
return
#global
LoadDebugWindowStatusFromFile
#endif
#endif
| |
|
2020/5/25(Mon) 21:10:41|NO.90636
"userdef.as"で#includeする場合は、以下のスクリプトを使用するようにしてください。
(マクロ定義前に実行されてしまい、いろいろエラーが出てしまうため)
// デバッグウィンドウの状態を保持する
#ifdef _debug
#ifndef __KeepDebugWindowStatus__
#define global __KeepDebugWindowStatus__
; "mod_regexp.as"内でforとnextを使用しているが、このマクロは定義前で使用できないため、ここで一時的に定義する
#define global for(%1,%2=0,%3=0,%4=1) %tcontinue %i0 %tfor %1=%2:*%i %s4 %s1 :%tbreak exgoto %1,%4,%3,*%i
#define global next %tcontinue *%o :%tfor %o +=%o :goto *%o :%tbreak *%o
#define global _StatusFilePath dirinfo(1)+"\\DebugWindowStatus.ini" // 状態を保存するファイルのパス (HSPインストールフォルダに)
#include "mod_regexp.as"
#module _GetStatus
// ファイルの内容を変数に読み込む
#deffunc LoadStatusFile
sdim sFile
exist _StatusFilePath
if strsize!=-1{
sdim sFile,strsize
notesel sFile
noteload _StatusFilePath
}
return
// 読み込んだ内容から、指定されたキー名の数値を取り出す
#defcfunc GetStatus str keyName, int nDefault
dim ret
sdim sStat
sStat = submatch(sFile, "^\\s*"+keyName+"\\s*=\\s*(-?\\d+)"); "キー名="の後の数値を取り出す
if sStat == "" {
ret = nDefault
}else{
ret = int(sStat)
}
return ret
#global
#module _LoadAndSaveDebugWindowStatus
#uselib "user32.dll"
#func GetWindowThreadProcessId "GetWindowThreadProcessId" sptr,sptr
#func GetDesktopWindow "GetDesktopWindow"
#func GetTopWindow "GetTopWindow" sptr
#func GetWindow "GetWindow" sptr,sptr
#func GetWindowText "GetWindowTextA" sptr,sptr,sptr
#func GetClassName "GetClassNameA" sptr,sptr,sptr
#func FindWindowEx "FindWindowExA" sptr,sptr,sptr,sptr
#func GetWindowLong "GetWindowLongA" sptr,sptr
#define GW_HWNDNEXT $00000002
#define TCM_SETCURSEL $0000130C
#define WM_NOTIFY $0000004E
#define TCN_SELCHANGING $FFFFFDD8
#define GWL_ID $FFFFFFF4
#define BM_SETCHECK $000000F1
#define WM_COMMAND $00000111
#define TCM_GETCURSEL $0000130B
#define BM_GETCHECK $000000F0
// ファイルから状態を読み込んで復帰させる
#deffunc LoadDebugWindowStatusFromFile
// 自分のデバッグウィンドウを探す
dim isExistDebugWindow
isExistDebugWindow = 1
; 自分のプロセスID取得
dim ownPId
GetWindowThreadProcessId hwnd, varptr(ownPId)
; 一番上のウィンドウから下へ順に探す
dim hDebugWindow
dim hTgt : dim tgtPId : sdim tgtTitle,256 : sdim tgtClassName,256
hTgt = GetTopWindow( GetDesktopWindow() )
repeat
hTgt = GetWindow(hTgt,GW_HWNDNEXT)
if hTgt {
// プロセスIDが自分と同じ
GetWindowThreadProcessId hTgt, varptr(tgtPId)
if tgtPId==ownPId{
// ウィンドウタイトルが"Debug Window"
GetWindowText hTgt, varptr(tgtTitle), 256
if tgtTitle=="Debug Window"{
// クラス名が"HSP3DEBUG"
GetClassName hTgt, varptr(tgtClassName), 256
if tgtClassName=="HSP3DEBUG"{
hDebugWindow = hTgt
break
}
}
}
} else : break
loop
if hDebugWindow == 0 : return
// タブの選択インデックス を復帰
; タブのハンドル取得
dim hTab
hTab = FindWindowEx(hDebugWindow, 0, "SysTabControl32", 0)
if hTab == 0 : isExistDebugWindow = 0
LoadStatusFile; ファイルを読み込み
; 選択インデックス設定
sendmsg hTab, TCM_SETCURSEL, GetStatus("SelectedTabIndex",0)
; タブが変更されたことを親ウィンドウに通知
dim NMHDR,3
NMHDR = hwnd, GetWindowLong(hTab,GWL_ID), TCN_SELCHANGING
sendmsg hDebugWindow, WM_NOTIFY, varptr(NMHDR)
// 変数タブのチェックボックスのチェック状態 を復帰
; タブ毎に親ウィンドウが違うみたいなので、変数タブの親ウィンドウのハンドルを取得
dim hParent
repeat 2
hParent = FindWindowEx(hDebugWindow, hParent, "#32770", 0)
loop
; チェックボックスのハンドル取得
dim hChkbox,4
dim chkboxNames,4 : dim keyNames,4
chkboxNames = "ソート", "モジュール", "配列変数", "メモリダンプ"
keyNames = "Sort", "Module", "ArrayVariable", "MemoryDump"
repeat 4
hChkbox(cnt) = FindWindowEx(hParent, 0, "Button", chkboxNames.cnt)
; チェック設定
isChk = GetStatus("Is"+keyNames.cnt, 0)
if isChk>1 : isChk=1
if isChk<0 : isChk=0
sendmsg hChkbox(cnt), BM_SETCHECK, isChk
; 親ウィンドウに通知
GetWindowLong hChkbox.cnt, GWL_ID
wp = (stat) & $FFFF | (BM_SETCHECK) << 16
sendmsg hParent, WM_COMMAND, wp, hChkbox.cnt
loop
return
// 状態をファイルに保存する
#deffunc SaveDebugWindowStatusToFile onexit
if isExistDebugWindow == 0 : return
sdim file,256
notesel file
// タブの選択されているインデックス
sendmsg hTab, TCM_GETCURSEL
noteadd strf("SelectedTabIndex=%d",stat)
// 変数タブのチェックボックスのチェック状態
keyNames = "Sort", "Module", "ArrayVariable", "MemoryDump"
repeat 4
sendmsg hChkbox(cnt),BM_GETCHECK
noteadd strf("Is%s=%d", keyNames.cnt, stat)
loop
notesave _StatusFilePath
return
#global
LoadDebugWindowStatusFromFile
; マクロ取り消し
#undef for
#undef next
#endif
#endif
| |
|