VBSでCtrl+Alt+Deleteするには【未解決】

  • [記事公開]2023.01.21
  • VBS

一日調べて解決できなかったけれど、自分用に記事にします。

きっかけ

きっかけは例によってYahoo!知恵袋です。

vbsを使ってctrl alt delを押した時に出る画面を表示させたいと思い

Set WshShell = Wscript.CreateObject(“Wscript.Shell”)

WshShell.Sendkeys(“^%{DEL}”)

として、実行してみたのですが表示されませんでした。

何か記述が足らないからでしょうか?

https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q10274096935
CTRL+ALT+DELETEで出る画面

私もやってみました↓が、確かに動きません。なんで?

作ったスクリプト。管理者権限で実行してみても一瞬画面がちらっとするだけで、青い画面はでません。

似たような質問

調べてみたところ、似たような質問が過去にいっぱいありました。

VBSでCTRL+ALT+DELを実行したい

CTRL + ALT + DELETE を バッチファイルかVBSファイルより行う方法

Sendkeys – Ctrl+Alt+Del

Trying to use SendKeys() to hit Ctrl-Alt-Del

Ctrl + Alt + End を押した画面を表示させるアイコンを作りたい

How to send Ctrl+Alt+End to Remote Desktop?

この一番最後の質問にあるPowerShellを使う方法も、コマンドプロンプトでexplorer.exeを使う方法も試してみたのですが、うまくいきませんでした。プロンプトは返ってくるけど、なにも変化なし。

試したこと

私が試してみたことは以下のとおりです。いずれも失敗に終わっています。

SendKeys

質問者様のスクリプトを試してみました。

Set WshShell = Wscript.CreateObject("Wscript.Shell")
WshShell.Sendkeys("^%{DEL}")

アクティブなウィンドウに対してキーコードを送っているのかな?と思い、デスクトップを表示するステップを追加してみましたが、これもうまくいきませんでした。

CreateObject("Shell.Application").ToggleDesktop
Set WshShell = Wscript.CreateObject("Wscript.Shell")
WshShell.Sendkeys("^%{DEL}")

keybd_event

WindowsAPIを使えばうまくいくかも?と思い、こちらのサイト「【WSH】VBScriptでPrintscreen・Alt+Printscreenしてみた」を参考に、keybd_eventを使ってみましたが、これもうまくいきませんでした。

Set SHELL = WScript.CreateObject("WScript.Shell")
Set Excel = WScript.CreateObject("Excel.Application")

'KEY CODE
Const VK_CONTROL  = &H11    'CTRL
Const VK_MENU     = &H12    'ALT
Const VK_DELETE   = &H2E    'DEL
Const VK_LCONTROL = &Ha2    '左CTRL
Const VK_RCONTROL = &Ha3    '右CTRL

Sub CTRLALTDEL
    'デスクトップの表示
    CreateObject("Shell.Application").ToggleDesktop
    'CTRL On
    Call API_keybd_event(VK_LCONTROL,0,1,0)
    'ALT On
    Call API_keybd_event(VK_MENU,0,1,0)
    'DEL On
    Call API_keybd_event(VK_DELETE,0,1,0)
    'DEL Off
    Call API_keybd_event(VK_DELETE,0,3,0)
    'ALT Off
    Call API_keybd_event(VK_MENU,0,3,0)
    'CTRL Off
    Call API_keybd_event(VK_LCONTROL,0,3,0)
    'CTRL Off
    Call API_keybd_event(VK_RCONTROL,0,3,0)
End Sub

Sub API_keybd_event(bVk, bScan, dwFlags, dwExtraInfo)
    Dim strFunction
    Const API_STRING = "CALL(""user32"",""keybd_event"",""JJJJJ"", $1, $2, $3, $4)"
    strFunction = Replace(Replace(Replace(Replace(API_STRING, "$1", bVk), "$2", bScan), "$3", dwFlags), "$4", dwExtraInfo)
    Call Excel.ExecuteExcel4Macro(strFunction)
End Sub


'***************************************
'Simplae Test
'***************************************
CTRLALTDEL
msgbox "End"

上記のコードの中で、CTRLを左CTRLと右CTRLの両方を使っているのは、こちらのサイト「【ExcelVBA】keybd_eventをつかってCitrix経由で起動しているアプリにキー入力を送る。(手作りRPA)」を参考にしました。

でも結局動かず・・・・。

コマンドプロンプト

先の質問群の中でどなたかが回答していた、コマンドプロンプトでexplorer.exeを使う方法はこちらです。

C:\>explorer.exe shell:::{2559a1f2-21d7-11d4-bdaf-00c04f60b9f0}

管理者権限でやってみましたが、特に何の変化もありませんでした。

PowerShell

先の質問群の中でどなたかが回答していた、PowerShellでWindowsSecurity()を使う方法はこちらです。

PS C:\> (New-Object -COM Shell.Application).WindowsSecurity()

管理者権限で実行してみましたが、特に何も起きませんでした。

長いバージョンも試してみましたが、何も起きませんでした。

PS C:\> Powershell -noprofile -nologo -noninteractive -command "(new-object -ComObject shell.application).WindowsSecurity()"

まとめ

どこかで誰かが書いていましたが、CTRL+ALT+DELETEで出る画面はOS(Windows)制御下にありますので、OSとやりとりしないとできないようです。例えば画面ロックだったら、コマンドプロンプトで

rundll32.exe user32.dll,LockWorkStation

とすればロックできます。

コマンドプロンプトでロック画面が出た

同様に、CTRL+ALT+DELETEの画面もuser32.dllとかで制御できないかなーーー?と思いましたが、無理でした。