VBレスキュー(花ちゃん)
VB2005用トップページへVBレスキュー(花ちゃん)のトップページVB6.0用のトップページ各掲示板

メニューへ戻ります。 キーボード・キー操作関係のメニュー
1.どのキーが押されたかを取得する方法色々
2.特殊キーの状態を取得・タブキーの押下を取得する
3.SendInput 関数を使ってプログラム上からキーボードを操作する
4.アプリ上でのキー操作用に特化した自作 DLL の使用例 
5.SendKeys を使ってキーストロークをアクティブなアプリケーションに送信する
6.
7.
8. 
9. 
10. 
11.
12.
 . 
20.その他、当サイト内に掲載のキーボード・キー操作に関するサンプル


3.SendInput 関数を使ってプログラム上からキーボードを操作する(12_Key_03) (旧、SampleNo.351)
1.SendInput 関数を使ってプログラム上からキーボードを操作する
2.
3.
4.
5.
6.

 下記プログラムコードに関する補足・注意事項 
動作確認:Windows 8.1 (Windows 7) / VB2013 (VB2010) / Framework 4.5.1 / 対象の CPU:x86
Option :[Compare Text] [Explicit On] [Infer On] [Strict On]
Imports :System.Runtime.InteropServices
参照設定:
追加なし
その他 :このサンプルは、 Win32 APIを使用しておりますので、ある程度Win32 API が理解できる方がお使い下さい。
    :使用するコントロールは、下図を参照に適当に配置して下さい。
このサンプル等の内容を無断で転載、掲載、配布する事はお断りします。(私の修正・改訂・削除等が及ばなくなるので)
必要ならリンクをはるようにして下さい。(引用の場合は引用元のリンクを明記して下さい)
このページのトップへ移動します。 1.SendInput 関数を使ってプログラム上からキーボードを操作する
下記のNo.5 No.7 で、魔界の仮面弁士 さんに .NET での SendInput 関数の使い方を教えて頂いて、動作確認できましたのでここへ投稿しておきます。
http://hanatyan.sakura.ne.jp/yybbs/read.cgi?no=79

尚、サンプルは、関数の動作を確認する為にテキストボックスに文字を入力しておりますがその事が目的ではありませんので誤解無き様願います。



Imports System.Runtime.InteropServices

Public Class Form1

#Region "本文関係の処理(Button_Click イベントの処理等)"

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    TextBox1.Focus()
    Dim wKey() As keyEvents    'キーボード操作を設定する為の構造体
    ReDim Preserve wKey(7)     '上記を配列で使用

    wKey(0).kCode = Keys.A : wKey(0).kFrg = 0      'A キーダウン
    wKey(1).kCode = Keys.A : wKey(1).kFrg = 1      'A キーアップ
    wKey(2).kCode = Keys.B : wKey(2).kFrg = 0      'B キーダウン
    wKey(3).kCode = Keys.B : wKey(3).kFrg = 1      'B キーアップ
    wKey(4).kCode = Keys.Tab : wKey(4).kFrg = 0    'TAB キーダウン
    wKey(5).kCode = Keys.Tab : wKey(5).kFrg = 1    'TAB キーアップ
    wKey(6).kCode = Keys.C : wKey(6).kFrg = 0      'C キーダウン
    wKey(7).kCode = Keys.C : wKey(7).kFrg = 1      'C キーアップ

    Call SedKeyInput(wKey)
End Sub

Private Function SedKeyInput(ByVal wkey() As keyEvents) As Integer
    SedKeyInput = 0
    Dim eventN As Integer = wkey.GetUpperBound(0)
    Dim arrayINPUT(eventN) As INPUT
    For i As Integer = 0 To eventN                           'キーの操作回数分
        arrayINPUT(i).type = INPUT_KEYBOARD                   'キーボードイベントを設定(定数=1)
        With arrayINPUT(i).ki
            .wVk = CShort(wkey(i).kCode)                       'キーコードを指定
            .wScan = CShort(MapVirtualKey(wkey(i).kCode, 0))   'スキャンコードを指定
            If wkey(i).kFrg = 0 Then
            .dwFlags = dwFlag1                              'キーダウン
            Else
            .dwFlags = dwFlag3                              'キーアップ
            End If
            .time = 0                                          '無視
            .dwExtraInfo = IntPtr.Zero                         '無視
        End With
    Next
    '関数の実行(連続でキーを入力)'個々のキー入力の間に割り込みが入らない。
    SendInput(arrayINPUT.Length, arrayINPUT, Marshal.SizeOf(GetType(INPUT)))
End Function

#End Region

#Region "付帯処理関係(関数・メソッド及びWin32 API 関数の宣言及び変数の宣言等含む)"

'SendInput 関数でキー操作に関する動作等を指定する KEYBDINPUT 構造体
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Auto)> _
Private Structure KEYBDINPUT
    Public wVk As Short           '仮想キーコードのコード254の範囲内の値を設定
    Public wScan As Short         'ハードウェアキーのスキャンコードを設定
    Public dwFlags As Integer     'キーボードの動作を指定するフラグを設定
    Public time As Integer        'タイムスタンプ(このメンバーは無視されます)
    Public dwExtraInfo As IntPtr  '追加情報(このメンバーは無視されます)
End Structure

'SendInput 関数の設定に使用する INPUT 構造体
    'type    SendInput 関数の使用目的 0=マウス 1=キーボード 2=ハードウェア
    'ki      KEYBDINPUT 構造体
<StructLayout(LayoutKind.Sequential, Size:=28)> _
Private Structure INPUT
    Public type As Integer
    Public ki As KEYBDINPUT
End Structure

'キーストローク、マウスの動き、ボタンのクリックなどを合成します。
    ' nInputs   入力イベントの数
    ' pInputs()    挿入する入力イベントの配列
    ' cbsize       構造体のサイズ
    ' 戻り値       挿入することができたイベントの数を返す。
    '              ブロックされている場合は 0 を返す
<DllImport("user32.dll", CharSet:=CharSet.Auto)> _
Private Shared Function SendInput( _
    ByVal nInputs As Integer, _
    ByVal pInputs() As INPUT, _
    ByVal cbsize As Integer) As Integer
End Function

'仮想キーコード・ASCII値・スキャンコード間でコードを変換する(P1067)
    'wCode     仮想キーコードまたはスキャンコード
    'wMapType   実行したい変換の種類
    '戻り値     スキャンコード、仮想キーコード、ASCII 値のいずれかが返ります。
    '           変換されないときは、0 が返ります。
<DllImport("user32.dll", CharSet:=CharSet.Auto)> _
Private Shared Function MapVirtualKey( _
    ByVal wCode As Integer, _
    ByVal wMapType As Integer) As Integer
End Function

'キーボード操作を設定する為の自作構造体
    'kCode   'キーコード定数を指定
    'kFrg    'キーの動作を指定 0=キーダウン 1=キーアップ
<StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Auto)> _
Private Structure keyEvents
    Public kCode As Integer
    Public kFrg As Short
End Structure

Private Const KEYEVENTF_KEYUP As Integer = &H2        'キーアップ キーダウン = 0
Private Const KEYEVENTF_EXTENDEDKEY As Integer = &H1  'スキャンコードは拡張コード
Private Const INPUT_KEYBOARD As Integer = 1           'キーボードイベントを発生させます
Private Const dwFlag1 As Integer = KEYEVENTF_EXTENDEDKEY Or 0     'キーダウン
Private Const dwFlag3 As Integer = KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP   'キー UP

#End Region

End Class



 図1.上記実行結果及び使用コントロール類の配置図
 vb2013keyboard03_01

このページのトップへ移動します。 2.

このページのトップへ移動します。 3.



このページのトップへ移動します。 4.



このページのトップへ移動します。 5.



このページのトップへ移動します。 6.



このページのトップへ移動します。 検索キーワード及びサンプルコードの別名(機能名)





このページのトップへ移動します。