【UWSC】Windows7でLOCKHARDを有効にする

LOCKHARD は、キーボードやマウスからの入力を禁止する関数。
LOCKHARD関数は、管理者権限がなければ、きちんと動かない。

テストスクリプト1
-----------------------------------
LOCKHARD(TRUE)

FOR A = 10 TO 1 STEP -1

FUKIDASI("入力禁止中(あと" + A + "秒)。強制解除はCtrl + Alt + Delete",100,100,0,40)

SLEEP(1)

NEXT
-----------------------------------

テストスクリプト2
-----------------------------------
LOCKHARD(TRUE)

//100秒キー入力無効!強制解除はCtrl + Alt + Delete
SLEEP(100)

LOCKHARD(FALSE)
-----------------------------------

LOCKHARD関数がきちんと動かないのなら、管理者権限がないということ。

管理者権限があるかどうかはいかのスクリプトでわかる
-----------------------------------
DEF_DLL IsUserAnAdmin(): BOOL: shell32
IFB IsUserAnAdmin() THEN
  MSGBOX("管理者権限あり")
ELSE
  MSGBOX("管理者権限なし")
ENDIF
-----------------------------------

管理者権限を有効にするには、uwsc.exe か そのショートカットのコンテキストメニューを開き、「管理者として実行」でプログラムを起動させる。

しかしこの方法だと、拡張子が「.uws」のファイルから実行するとコンテキストメニューの「管理者として実行」の項目が無くてできなかった。それに毎回右クリックするのが面倒。

UWSCを常に管理者権限でプログラムを走らせるために、互換性タグ下の 特権レベル「管理者としてこのプログラムを実行する」 にチェックを入れる、という方法もあるがプログラムを開始するたびに「権限の昇格を確認するダイアログ」が出てこれも面倒。

結局、管理者権限が必要な関数(LOCKHARD 等)を使う場合だけ、管理者権限へ昇格するダイアログを出すことにした。

-----------------------------------
//管理者権限が無ければ、管理者権限のダイアログを出す
DEF_DLL IsUserAnAdmin(): BOOL: shell32
if ! IsUserAnAdmin() then
  UacElevate()
  exit
endif

LOCKHARD(TRUE)
FOR A = 10 TO 1 STEP -1

FUKIDASI("入力禁止中(あと" + A + "秒)。強制解除はCtrl + Alt + Delete",100,100,0,40)

SLEEP(1)
NEXT

procedure UacElevate(arg = "")
if pos(".exe", GET_UWSC_NAME) then
exe = GET_UWSC_NAME
dir = GET_CUR_DIR
else
exe = "UWSC.exe"
dir = GET_UWSC_DIR
arg = "<#DBL>" + GET_CUR_DIR + "\" + GET_UWSC_NAME + "<#DBL> " + arg
endif
sh = CreateOleObj("Shell.Application")
sh.ShellExecute(exe, arg, dir, "runas", 1)
fend
-----------------------------------

参考ページ
-----------------------------------

https://stuncloud.wordpress.com/2012/09/07/uwsc_uac_elevation/

-----------------------------------