スクリプト言語の HSP については、公式ホームページの「HSPTV!」をどうぞ。(戻る)
ここには、ちょっとしたツールを作成するときに活用できるシャットダウン命令群を紹介します。
- Windows のロック (LockWorkStation)
- Windows の休止状態 (SetShutdownMode+SetSystemPowerState)
- Windows のスタンバイ (SetShutdownMode+SetSystemPowerState)
- Windows のログオフ (SetShutdownMode+ExitWindowsEx)
- Windows の再起動 (SetShutdownMode+ExitWindowsEx)
- Windows の終了 (SetShutdownMode+ExitWindowsEx)
上記のカッコ内で SetShutdownMode 命令はユーザー定義命令ですが、
SetSystemPowerState 命令、ExitWindowsEx 命令の2つは Win32API 関数です。
詳しい技術資料などはC言語カテゴリの下記を参照して下さい。
ここで紹介する命令は HSP で使えるようにC言語からHSP用に新たに書き下ろした命令群です。
技術資料
関連カテゴリ
SetShutdownMode 命令
C言語で紹介していた「指定した特権名の有効/無効」の ProcessPrivilegeName 関数は、
第1引数(hProcess)には「GetCurrentProcess」命令を
第2引数(lpPrivilegeName)には「SE_SHUTDOWN_NAME」文字列を
第3引数(bEnable)には「TRUE」定数を内部で記述して
新しい SetShutdownMode 命令として紹介してます。
この命令には引数はなく、実行するとシャットダウン可能なモードに設定されます。
つまり、C言語で紹介していた ProcessPrivilegeName 関数の使い方を見ると3つの引数は常に固定的でした。
そこで HSP のユーザー定義命令の SetShutdownMode は、引数なしで呼び出す仕様にしてます。
これにより、使い方が簡単でソースコードがスッキリします。
SetShutdownMode の使い方
// Windowsのロック LockWorkStation
// Windowsの休止状態 SetShutdownMode SetSystemPowerState 0,0
// Windowsのスタンバイ SetShutdownMode SetSystemPowerState 1,0
// Windowsのログオフ SetShutdownMode ExitWindowsEx EWX_LOGOFF,0
// Windowsの再起動 SetShutdownMode ExitWindowsEx EWX_REBOOT,0
// Windowsの終了 SetShutdownMode ExitWindowsEx EWX_POWEROFF,0
動作確認のサンプル
//------------------------------------------------------------------------------ // シャットダウン命令のサンプル by 科学太郎 //============================================================================== // @URL(https://msdn.microsoft.com/ja-jp/library/ff556846.aspx)→「TOKEN_PRIVILEGES structure」 // @URL(https://msdn.microsoft.com/ja-jp/library/ff549716.aspx)→「LUID_AND_ATTRIBUTES structure」 // @URL(https://msdn.microsoft.com/ja-jp/library/ff549708.aspx)→「LUID」 //------------------------------------------------------------------------------ #include "User32.as" #include "Advapi32.as" #include "Kernel32.as" //-------------------------------------- // 記号定数(API定数) //-------------------------------------- #const global NULL 0 #const global IDYES 6 #const global IDNO 7 # #const global EWX_LOGOFF $00000000 #const global EWX_REBOOT $00000002 #const global EWX_POWEROFF $00000008 # #const global TOKEN_QUERY $00000008 #const global TOKEN_ADJUST_PRIVILEGES $00000020 #const global SE_PRIVILEGE_ENABLED $00000002 # #define global SE_SHUTDOWN_NAME "SeShutdownPrivilege" //-------------------------------------- // メイン部 //-------------------------------------- *Main screen 0,640,480,SCREEN_NORMAL|SCREEN_FIXEDSIZE syscolor 15:boxf:color:title "シャットダウン命令のサンプル by 科学太郎" ;配置 objsize 150,25 button gosub "Windowsのロック", *PushWinLock button gosub "Windowsの休止状態", *PushSleep button gosub "Windowsのスタンバイ", *PushStandBy button gosub "Windowsのログオフ", *PushLogOff button gosub "Windowsの再起動", *PushReboot button gosub "Windowsの終了", *PushShutdown stop //-------------------------------------- // Windowsのロックを実行 //-------------------------------------- *PushWinLock msg="Windows OS は、これからロック状態に移行します。\n\nよろしいですか?" dialog msg,3,"確認" if(stat==IDYES){ LockWorkStation } return //-------------------------------------- // Windowsの休止状態を実行 //-------------------------------------- *PushSleep msg="Windows OS は、これから休止状態に移行します。\n\nよろしいですか?" dialog msg,3,"確認" if(stat==IDYES){ SetShutdownMode SetSystemPowerState 0,0 } return //-------------------------------------- // Windowsのスタンバイを実行 //-------------------------------------- *PushStandBy msg="Windows OS は、これからスタンバイ・モードに移行します。\n\nよろしいですか?" dialog msg,3,"確認" if(stat==IDYES){ SetShutdownMode SetSystemPowerState 1,0 } return //-------------------------------------- // Windowsのログオフを実行 //-------------------------------------- *PushLogOff msg="Windows OS は、これからログオフを実行します。\n\nよろしいですか?" dialog msg,3,"確認" if(stat==IDYES){ SetShutdownMode ExitWindowsEx EWX_LOGOFF,0 } return //-------------------------------------- // Windowsの再起動を実行 //-------------------------------------- *PushReboot msg="Windows OS は、これから再起動を実行します。\n\nよろしいですか?" dialog msg,3,"確認" if(stat==IDYES){ SetShutdownMode ExitWindowsEx EWX_REBOOT,0 } return //-------------------------------------- // Windowsの終了を実行 //-------------------------------------- *PushShutdown msg="Windows OS は、これから電源を切ります。\n\nよろしいですか?" dialog msg,3,"確認" if(stat==IDYES){ SetShutdownMode ExitWindowsEx EWX_POWEROFF,0 } return //-------------------------------------- // 特権名「SE_SHUTDOWN_NAME」の有効 //-------------------------------------- #deffunc SetShutdownMode\ local hToken,local Luid,local NewPriv dim hToken:dim Luid,2:dim NewPriv,4 ;アクセストークンのハンドルを取得 GetCurrentProcess OpenProcessToken stat,(TOKEN_QUERY|TOKEN_ADJUST_PRIVILEGES),varptr(hToken) if(stat){ ;特権名のLUIDを取得 LookupPrivilegeValue NULL,SE_SHUTDOWN_NAME,varptr(Luid) if(stat){ NewPriv(0)=1 ;特権数 NewPriv(1)=Luid(0) ;識別子 NewPriv(2)=Luid(1) ; 〃 NewPriv(3)=SE_PRIVILEGE_ENABLED ;特権トークン状態の有効/無効 AdjustTokenPrivileges hToken,0,varptr(NewPriv),0,NULL,NULL } CloseHandle hToken } return //------------------------------------------------------------------------------ // End of sample184d.hsp //------------------------------------------------------------------------------
関連記事
- シャットダウンのサンプル
- クリーニングのサンプル
※コメント投稿者のブログIDはブログ作成者のみに通知されます