UWSCRの組み込み関数：システム系

システム系組み込み関数の変更および新規追加された関数についての解説です。

# 変更点

## kindofos

戻り値に対応した定数を新たに定義しました。

|       定数      | 値  |
|-----------------|----|
| OS_WIN2000      | 12 |
| OS_WINXP        | 13 |
| OS_WINSRV2003   | 14 |
| OS_WINSRV2003R2 | 15 |
| OS_WINVISTA     | 20 |
| OS_WINSRV2008   | 21 |
| OS_WIN7         | 22 |
| OS_WINSRV2008R2 | 27 |
| OS_WIN8         | 23 |
| OS_WINSRV2012   | 24 |
| OS_WIN81        | 25 |
| OS_WINSRV2012R2 | 26 |
| OS_WIN10        | 30 |
| OS_WINSRV2016   | 31 |
| OS_WIN11        | 32 |

:::note warn
とはいえUWSCRがWindows 10以降でしか動作しないので大半は無意味となりました。
一応Windows 11の判定もしてはいますが、正しく判定されるかどうかはわかりません。またServer 2016よりあとのServer OSには対応していません。
:::

加えて、OS情報を得るための数値引数に対応した定数も定義しています。

|      定数      |             解説             |
|----------------|------------------------------|
| OSVER_MAJOR    | OSのメジャーバージョンを返す |
| OSVER_MINOR    | OSのマイナーバージョンを返す |
| OSVER_BUILD    | OSのビルド番号を返す         |
| OSVER_PLATFORM | OSのプラットフォームIDを返す |

```php:筆者環境による例
print kindofos(OSVER_MAJOR)    // 10
print kindofos(OSVER_MINOR)    // 0
print kindofos(OSVER_BUILD)    // 19045
print kindofos(OSVER_PLATFORM) // 2
```


:::note info
これはUWSCの隠し機能を正式に採用したものです。
:::

## powershell

第四引数を`TRUE`にすることで`$PROFILE`を読み込まずに実行(`-NoProfile`)できるようになりました。`$PROFILE`の読み込みが原因でエラーが発生する場合はこれを利用してください。デフォルトは`FALSE`です。

```php
cmd = "ls *.txt"
print powershell(cmd,,,TRUE) // $PROFILEを読み込まない
```

:::note alert
#### `0.14.0`で動作しません

base64エンコード処理に問題がありpowershell関数が正常に動作していませんでした。この問題は`0.15.0`で修正されます。
:::

## sound

`BEEP`指定によるビープ音再生が廃止されました。
また、現時点では再生デバイスの指定ができません。(制限事項)

## getkeystate

UWSCでは`TGL_KANALOCK`や`TGL_IME`が正常に動作していませんでした。これはUWSCがウィンドウ毎のIME状態取得に対応していなかったためです。UWSCRは第二引数にidを指定することでこれらの状態を正確に取得できるようになりました。idが未指定の場合はアクティブウィンドウを対象とします。

```php
id = getid("qiita")
print getkeystate(TGL_KANALOCK, id)
print getkeystate(TGL_IME, id)
```

## sethotkey

UWSCではsethotkeyに関数名を渡していましたが、UWSCRでは関数名に加えてユーザー定義関数自体を渡せるようになりました。

```php:uwsc
sethotkey(VK_A, , "proc")

procedure proc()
    print HOTKEY_VK
fend
```

```php:uwscr
procedure proc()
    print HOTKEY_VK
fend

// 関数名
sethotkey(VK_A, , "proc")
// 関数自体を渡す
sethotkey(VK_B, , proc)
```

## poff

`poff(P_UWSC_REEXEC)`で第二引数を省略した場合のデフォルト値が`TRUE`になりました。

## gettime

基準日時に対する補正値の単位指定と、戻り値をミリ秒にするオプションが追加されました。単位は第三引数に定数で指定します。デフォルトは`G_OFFSET_DAYS`です

|       定数       | 補正値の単位 |
|------------------|--------------|
| G_OFFSET_DAYS    | 日数         |
| G_OFFSET_HOURS   | 時間         |
| G_OFFSET_MINUTES | 分           |
| G_OFFSET_SECONDS | 秒           |
| G_OFFSET_MILLIS  | ミリ秒       |

```php
datetime = "2023/12/25 12:25:25"

// 1日進める
sec = gettime(1, datetime, G_OFFSET_DAYS)
print format(sec, "%+") // 2023-12-26T12:25:25+09:00

// 2時間戻す
sec = gettime(-2, datetime, G_OFFSET_HOURS)
print format(sec, "%+") // 2023-12-25T10:25:25+09:00

// 35分進める
sec = gettime(35, datetime, G_OFFSET_MINUTES)
print format(sec, "%+") // 2023-12-25T13:00:25+09:00

// 25秒戻す
sec = gettime(-25, datetime, G_OFFSET_SECONDS)
print format(sec, "%+") // 2023-12-25T12:25:00+09:00


// 123ミリ秒進める
// 第四引数TRUEでミリ秒を返す
milli = gettime(123, datetime, G_OFFSET_MILLIS, TRUE)
print format(milli, "%+", TRUE) // 2023-12-25T12:25:25.123+09:00
```

また、`G_TIME_WW`と比較するための曜日を示す定数が追加されました。

|      定数     | 曜日 |
|---------------|------|
| G_WEEKDAY_SUN | 日   |
| G_WEEKDAY_MON | 月   |
| G_WEEKDAY_TUE | 火   |
| G_WEEKDAY_WED | 水   |
| G_WEEKDAY_THU | 木   |
| G_WEEKDAY_FRI | 金   |
| G_WEEKDAY_SAT | 土   |


# 新規

## env

環境変数を展開します。

```php
print env("ProgramFiles") // C:\Program Files
```

:::note info
uwscr.exeのプロセス環境変数から読み取ります。
:::

## wmi

WQLを指定してWMIから情報を得ます。結果はUObject配列として返ります

```php
wql = 'select name, processid, commandline from Win32_Process where name = "uwscr.exe"'
for process in wmi(wql)
    print tojson(process, TRUE)
next
```

## shexec

ShellExecuteを行います。「ファイル名を指定して実行」やstartコマンドのように動作します。execとは異なりidは返しません。

```php
// execと異なりmsedgeと入れるだけでMSEdgeが起動できる
shexec("msedge", "http://example.com")
```

## pwsh

powershell関数が`Windows PowerShell`を実行するのに対し、pwsh関数は`PowerShell (Core)`を実行します。

:::note warn
PowerShell (Core) がインストールされていない場合は動作しません。
:::

```php
cmd = "ls *.txt"
print pwsh(cmd,,,TRUE)
```

:::note alert
#### `0.14.0`で動作しません

base64エンコード処理に問題がありpwsh関数が正常に動作していませんでした。この問題は`0.15.0`で修正されます。
:::

## beep

ビープ音を再生するための関数です。sound関数から機能が切り離されました。周波数や再生する時間、繰り返し再生の回数を指定できます。

```php
// 1800ヘルツで0.4秒間の再生を3回繰り返す
beep(400, 1800, 3)
```

```php:バックグラウンド再生
thread beep(200, 2000, 5)
msgbox("threadでビープ音をバックグラウンド再生")
```