VBA_SendKeysでWINボタンを押す方法!部分スクショを取る方法!

この記事は約7分で読めます。
スポンサーリンク
スポンサーリンク

VBA_SendKeysでWINボタンを押す方法!部分スクショを取る方法!

VBAでウインドウズボタンを押したい!!

と思ったことはありませんか?

例えば、WINDOWS10で新たに追加された、

win+Shift+S

のスクリーンショットです。

Shift+Sであったら、

SendKeys “+S”

Ctrl+Shift+Sであったら

SendKeys “^(+S)”

で済むのですが、
残念ながらwinキーは割り当てが有りません。

そこで、今回はSendKeysでwinボタンを押す方法を説明していきたいと思います。

早速コードを確認。

ということで、Sendkeysでwinボタンを押すといったのですが、
実はSendkeysのコマンドで、winボタンを押すことは不可能で、
その代わりに、keybd_eventを使う必要があります。

実際のプログラムを見ながら、確認していきましょう。
win+Shift+sを押すコマンドは、

 
'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 Declare Sub Sleep Lib "KERNEL32.dll" (ByVal dwMilliseconds As Long)

Sub winを押す()

       Call keybd_event(&H5B, 0, 0, 0) 'Windowsキーを押す
        Call keybd_event(&H10, 0, 0, 0) 'Shiftキーを押す
        Call keybd_event(83, 0, 0, 0) 'sキーを押す

        Sleep(100)

        Call keybd_event(&H5B, 0, 2, 0) 'Windowsキーをあげる 
        Call keybd_event(&H10, 0, 2, 0) 'Shiftキーをあげる  
        Call keybd_event(83, 0, 2, 0) 'sキーをあげる(キーを上げる動作がないとおかしくなる)

End Sub

となります。

keybd_event

は、キー送信するAPIです。

SendKeysと同じですが、SendKeysでは、「win」ボタンが送信できないために使用しています。

keybd_eventでの処理が完全に終了しているかの判定が難しいので、
念のため、Sleepを入れてあります。※DoEventsでも解決できるはずですが一応。

Sleepは、

Private Declare Sub Sleep Lib “KERNEL32.dll” (ByVal dwMilliseconds As Long)

Sleep(100)

これで0.1秒です。

ここまでで、win+Shift+sを押すことができましたので、
ここからをマウスを動かすジェスチャーを入れて、
画面の切り取りを自動化していきたいと思います。

マウスの自動化を入れて指定の領域を切り取る。

マウスの自動化を入れたプログラムが↓です。

Private Type Position
    x As Long
    y As Long
End Type
Declare Function SetCursorPos Lib "user32" (ByVal x As Long, ByVal y As Long) As Long
Declare Sub mouse_event Lib "user32" ( _
    ByVal dwFlags As Long, _
    Optional ByVal dx As Long = 0, _
    Optional ByVal dy As Long = 0, _
    Optional ByVal dwDate As Long = 0, _
    Optional ByVal dwExtraInfo As Long = 0)
Declare Function GetCursorPos Lib "user32" _
    (lpPoint As Position) As Long
    
Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

'mouse_event用の定数宣言
Private Const MOUSEEVENTF_ABSOLUTE = &H8000
Private Const MOUSEEVENTF_MOVE = &H1
Private Const MOUSEEVENTF_LEFTDOWN = &H2
Private Const MOUSEEVENTF_LEFTUP = &H4
Private Const MOUSEEVENTF_RIGHTDOWN = &H8
Private Const MOUSEEVENTF_RIGHTUP = &H10
Private Const MOUSEEVENTF_MIDDLEDOWN = &H20
Private Const MOUSEEVENTF_MIDDLEUP = &H40

'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)

'↓ここからメインプログラム

Sub 画面切り取り()

        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キーをあげる

    DoEvents
    Application.Wait [Now()] + 50 / 86400000
    
    SetCursorPos 900, 140 '左から900ピクセル、上から140ピクセルの位置にカーソルを移動

    Sleep 200

    mouse_event MOUSEEVENTF_LEFTDOWN  '左ボタン押下(範囲選択のクリックのつもり)

    Sleep 200

    SetCursorPos 1599, 641 '範囲選択のマウス移動

    Sleep 200

    mouse_event MOUSEEVENTF_LEFTUP  '左ボタン解放

    Sleep 200

    Cells(1 1).PasteSpecial

End Sub

範囲を指定するために、
マウスのポインタの開始の位置と終了の位置を変更することで、
画面の切り取りをすることができます。

切り取られた画面は、クリップボードにコピーされますので、
そのままセルに張り付けをして画像貼り付けは完了となります。

IEを動かすプログラムと連動させることで、ページごとのスクリーンショットを撮影することが可能になりますので、いろいろと幅が広がると思います。

その他、VBAでIEを動かすために必要な情報をまとめています!!

スポンサーリンク
スポンサーリンク
IE関係 マクロVBA
スポンサーリンク
nujonoaをフォローする
nujonoa_blog

コメント欄

タイトルとURLをコピーしました