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


HSPTV!掲示板


未解決 解決 停止 削除要請

2020
0525
こいる標準デバッグウィンドウの状態を保持する1解決


こいる

リンク

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



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