今回の環境
Windows10(2017年4月以降のアップデートが適用済)
Microsoft Visujal Studio Community 2017
VB SendKeys Windowsキーなどで検索すると
VBからWindowsキーを操作する方法としてSendKyesを使用する方法が紹介されていますが
SendKeys.Send("^{ENTER}") 'Ctrl + Escキー
これはWindowsキーが一般的なキーボードに搭載されてい無かった時代にWindowsキーの代替する方法としてCtrl+EscでWindowsキーと同じ動作が割り当てている名残であり、実際のWindowsキーが押されている状態と同じではありません。
その為、昨今のWindowsキー+「何かのキー」(Windowsキー+E でエクスプローラ起動)といったショートカットには対応していません。
Windows10の2017年4月以降のアップデートで新たに搭載された「Windows+Shift+S」をエミュレートしてみたいと思います。
(「Windows+Shift+S」は画面のスクリーンショットを範囲指定で取得する機能です。)
よく同様の機能を実装する為にWin32APIを使用する方法で ByVal dwFlags As Long, ByVal dwExtraInfo As Long と宣言されている例がありますが、
2019年4月現在では正常に動作せずLongで宣言している部分をIntegerで宣言する必要があります。
ByVal dwFlags As Integer, ByVal dwExtraInfo As Integer
また、キーを押す操作の後にキーをあげる操作を忘れるとフォームを終了するまでキーが押されたままの状態になりWindows自体の動作がおかしくなりますので必ずキーをあげる操作を忘れないでください。
Public Class Form1
Public Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, ByVal bScan As Byte, ByVal dwFlags As Integer, ByVal dwExtraInfo As Integer)
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click '今回はボタンクリックイベントですが他のイベントでも可能です。
Call keybd_event(&H5B, 0, 0, 0) 'Windowsキーを押す
Call keybd_event(&H10, 0, 0, 0) 'Shiftキーを押す
Call keybd_event(83, 0, 0, 0) 'sキーを押す
Call keybd_event(&H5B, 0, 2, 0) 'Windowsキーをあげる 『キーをあげる操作を忘れないようにしてください』
Call keybd_event(&H10, 0, 2, 0) 'Shiftキーをあげる 『忘れるとプログラムを終了するまでWindowsの動作がおかしくなります』
Call keybd_event(83, 0, 2, 0) 'sキーをあげる
End Sub
End Class
Windowsキーと組み合わせるキーとしてShiftキーやSキーの代わりに別のキーにすることにより、別のショートカットキーを実現することもできます(Windowsキー+Rで「ファイル名を指定して実行」を起動するなど)
参考にしたサイト
https://www.petitmonte.com/visualbasic/vbapi_keybdevents.html