プログラミングのメモ帳(C/C++/HSP)

日々のプログラミングで気づいた点や小技集を紹介します。(Windows 10/XP/Vista、VC2017、HSP)

[HSP]シャットダウンのサンプル

2017年09月14日 05時48分00秒 | HSP講座

スクリプト言語の HSP については、公式ホームページの「HSPTV!」をどうぞ。(戻る)


ここには、ちょっとしたツールを作成するときに活用できるシャットダウン命令群を紹介します。

  1. Windows のロック (LockWorkStation)
  2. Windows の休止状態 (SetShutdownMode+SetSystemPowerState)
  3. Windows のスタンバイ (SetShutdownMode+SetSystemPowerState)
  4. Windows のログオフ (SetShutdownMode+ExitWindowsEx)
  5. Windows の再起動 (SetShutdownMode+ExitWindowsEx)
  6. 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
//------------------------------------------------------------------------------

関連記事



コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« タイムスタンプの記憶と再生 ... | トップ | [HSP]クリーニングのサンプル »
最新の画像もっと見る

コメントを投稿

HSP講座」カテゴリの最新記事