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ファイルより行う方法
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とかで制御できないかなーーー?と思いましたが、無理でした。
-
前の記事
【Word】ページごとにPDF化するには【VBA】 2023.01.20
-
次の記事
初めての確定申告(個人の感想です) 2023.01.22