トップ  >  サンプルソース  >  キーボードの擬似操作(C#/VB.NET)

キーボードの擬似操作(C#/VB.NET)

2011年12月22日

キーボードの押下を擬似的に行なうサンプル(ソース/コード)です。推奨されているAPI(SendInput)を使用しています。
※keybd_eventは推奨されていません

(参考)マウス操作やキーボード操作をシミュレーションするサンプル

' ----------------------------------------------------------
' 擬似的にキーボードを操作するサンプル(VB.NET/VS2005)
' Imports System.Runtime.InteropServicesの宣言が必要
' ----------------------------------------------------------
' keybd_eventの引数と同様のデータ
<StructLayout(LayoutKind.Sequential)> _
    Private Structure KEYBDINPUT
    Public wVk As Short
    Public wScan As Short
    Public dwFlags As Integer
    Public time As Integer
    Public dwExtraInfo As Integer
    Public dumy1 As Integer
    Public dumy2 As Integer
End Structure

' SendInputの引数データ
<StructLayout(LayoutKind.Sequential)> _
Private Structure INPUT
    Public type As Integer
    Public ki As KEYBDINPUT
End Structure

' キーボード操作をシミュレート(擬似操作)
<DllImport("user32.dll")> _
Private Shared Sub SendInput( _
    ByVal nInputs As Integer, _
    ByRef pInputs As INPUT, _
    ByVal cbsize As Integer)
End Sub

' キーコードをスキャンコードに変換
<DllImport("user32.dll", EntryPoint:="MapVirtualKeyA")> _
Private Shared Function MapVirtualKey( _
    ByVal wCode As Integer, _
    ByVal wMapType As Integer) As Integer
End Function

Private Const INPUT_KEYBOARD = 1    ' キーボードイベント

Private Const KEYEVENTF_KEYDOWN = &H0       ' キーを押す
Private Const KEYEVENTF_KEYUP = &H2         ' キーを離す
Private Const KEYEVENTF_EXTENDEDKEY = &H1   ' 拡張コード

Private Sub Button1_Click( _
ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button1.Click
    TextBox1.Focus()

    Dim inp As INPUT = New INPUT

    ' キーボードを押す
    inp.type = INPUT_KEYBOARD
    inp.ki.wVk = Keys.A
    inp.ki.wScan = MapVirtualKey(inp.ki.wVk, 0)
    inp.ki.dwFlags = _
        KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYDOWN
    inp.ki.dwExtraInfo = 0
    inp.ki.time = 0
    SendInput(1, inp, Marshal.SizeOf(inp))

    ' キーボードを離す
    inp.type = INPUT_KEYBOARD
    inp.ki.wVk = Keys.A
    inp.ki.wScan = MapVirtualKey(inp.ki.wVk, 0)
    inp.ki.dwFlags = _
        KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP
    inp.ki.dwExtraInfo = 0
    inp.ki.time = 0
    SendInput(1, inp, Marshal.SizeOf(inp))
End Sub
' ----------------------------------------------------------

// ---------------------------------------------------------
// 擬似的にキーボードを操作するサンプル(C#.NET/VS2005)
// using System.Runtime.InteropServices;の宣言が必要
// ---------------------------------------------------------
// keybd_eventの引数と同様のデータ
[StructLayout(LayoutKind.Sequential)]
private struct KEYBDINPUT
{
    public short wVk;
    public short wScan;
    public int dwFlags;
    public int time;
    public int dwExtraInfo;
    public int dummy1;
    public int dummy2;
};

// SendInputの引数データ
[StructLayout(LayoutKind.Sequential)]
private struct INPUT
{
    public int type;
    public KEYBDINPUT ki;
};

// キーボード操作をシミュレート(擬似操作)
[DllImport("user32.dll")]
private extern static void SendInput(
    int nInputs, ref INPUT pInputs, int cbsize);

// キーコードをスキャンコードに変換
[DllImport("user32.dll", EntryPoint = "MapVirtualKeyA")]
private extern static int MapVirtualKey(
    int wCode, int wMapType);

private const int INPUT_KEYBOARD = 1;   // キーボードイベント

private const int KEYEVENTF_KEYDOWN = 0x0;      // キーを押す
private const int KEYEVENTF_KEYUP = 0x2;        // キーを離す
private const int KEYEVENTF_EXTENDEDKEY = 0x1;  // 拡張コード

private void button1_Click(object sender, EventArgs e)
{
    textBox1.Focus();

    INPUT inp = new INPUT();

    // キーボードを押す
    inp.type = INPUT_KEYBOARD;
    inp.ki.wVk = (short)Keys.A;
    inp.ki.wScan =
        (short)MapVirtualKey(inp.ki.wVk, 0);
    inp.ki.dwFlags =
        KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYDOWN;
    inp.ki.dwExtraInfo = 0;
    inp.ki.time = 0;
    SendInput(1, ref inp, Marshal.SizeOf(inp));

    // キーボードを離す
    inp.type = INPUT_KEYBOARD;
    inp.ki.wVk = (short)Keys.A;
    inp.ki.wScan =
        (short)MapVirtualKey(inp.ki.wVk, 0);
    inp.ki.dwFlags =
        KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP;
    inp.ki.dwExtraInfo = 0;
    inp.ki.time = 0;
    SendInput(1, ref inp, Marshal.SizeOf(inp));
}
// ---------------------------------------------------------
スポンサーサイト

圧縮WEBページ解凍(C#/VB.NET) | トップページへ戻る | マウスの擬似操作(C#/VB.NET)

このページのトップに戻る

コメント

名前
題名
メールアドレス
WEBサイト
 
コメント
パスワード
  管理者にだけ表示を許可する

このページのトップに戻る

トラックバック

このページのトップに戻る