- 日時: 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
画像をクリックすると元のサイズで見る事ができます。
|