tagCANDY CGI VBレスキュー(花ちゃん) - VBレスキュー(花ちゃん)の投稿サンプル用掲示板 - Visual Basic 6.0 VB2005 VB2010
VB2005用トップページへVBレスキュー(花ちゃん)のトップページVB6.0用のトップページ
VBレスキュー(花ちゃん)の投稿サンプル用掲示板
     サンプル投稿用掲示板  VB2005 〜 用トップページ  VB6.0 用 トップページ
キーボード入力の自動化(SendInput 関数使用例) (VB.NET) ( No.0 )  [親スレッドへ]
日時: 2010/01/26 14:33
名前: 花ちゃん

***********************************************************************************
* カテゴリー:[キー操作][][]                                                *
* キーワード:キーストローク ,キーボード,キー入力,キーコード, ,                   *
***********************************************************************************
タイトル :キーボード入力の自動化(SendInput 関数使用例)
SampleNo :351  
投 稿 日 :2009/12/25
投 稿 者 :花ちゃん
-----------------------------------------------------------------------------------
下記のNo.5 No.7 で、魔界の仮面弁士 さんに .NET での SendInput 関数の使い方を教えて
頂いて、動作確認できましたのでここへ投稿しておきます。
http://www.hanatyan.sakura.ne.jp/yybbs/read.cgi?no=79

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

------------------------------------------------------------------------------------
使用するコントロールは、下図を参照に適当に配置して下さい。

'===================================================================================================
'SampleNo:351    2009.12.19     @ 2009.12.19
'タイトル:キーボード入力の自動化(SendInput 関数使用例)(351) - VB2008
'動作確認:WindowsVista VB2008(EE) Framework 3.5
'[Option Compare Text] [Option Explicit On] [Option Infer On] [Option Strict On]で設定
'---------------------------------------------------------------------------------------------------
'ソースコードは、保存オプションの詳細設定で、日本語(シフトJIS)-コードページ932 で保存しております。
'コードを折りたたむ方法と展開する方法 - #035
'http://blogs.msdn.com/vstipsjpn/archive/2008/05/22/8386191.aspx
'[ツール] メニューの [オプション] をクリックし、[テキスト エディタ] の [Basic]の[VB固有] ページで、
'[アウトラインモードを有効にする] チェック ボックスをオフにして頂くと見易いかと。
'========1=========2=========3=========4=========5=========6=========7=========8=========9=========0
Imports System.Runtime.InteropServices

Public Class Form1

#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

#Region "キーボードの操作の指示部分の設定"

Private Sub Button1_Click(ByVal sender As System.Object, _
                          ByVal e As System.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

#End Region

#Region "自作関数(SedKeyInput)の実行部分"

Private Function SedKeyInput(ByVal wkey() As keyEvents) As Integer
   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

End Class


画像をクリックすると元のサイズで見る事ができます。



 [スレッド一覧へ] [親スレッドへ]