none
プログラムからシフトキーのOn/Offを制御する方法について、教えてください。 RRS feed

  • 質問

  • プログラムからシフトキーのOn/Offを制御する方法について、ご存知の方が見えましたら教えてください。APIのSendInputを使ってみたのですが、なかなかうまく行きません。以下のコードで試してみたのですが、動作しませんでした。

    Imports System.Runtime.InteropServices
    Imports System.Text


    Public Class MainForm

    Private Sub Btn_R_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Btn_R.Click
                SendKeys.SendInput(&H10, 0)
    End Sub
    End Class

    Public Module SendKeys
        'SendInput Function
        <DllImport("user32.dll")> _
        Private Function SendInput( _
            ByVal nInputs As Integer, _
            ByRef pInputs As INPUT, _
            ByVal cbSize As Integer) _
            As Integer
        End Function

        'INPUT Structure
        <StructLayout(LayoutKind.Explicit)> _
        Private Structure INPUT
            <FieldOffset(0)> Dim type As Integer
            <FieldOffset(4)> Dim ki As KEYBDINPUT
        End Structure

        'KEYBDINPUT Structure
        <StructLayout(LayoutKind.Explicit)> _
        Private Structure KEYBDINPUT
            <FieldOffset(0)> Public wVk As Short
            <FieldOffset(2)> Public wScan As Short
            <FieldOffset(4)> Public dwFlags As Integer
            <FieldOffset(8)> Public time As Integer
            <FieldOffset(12)> Public dwExtraInfo As IntPtr
        End Structure

        'MapVirtualKey Function
        <DllImport("user32.dll")> _
        Private Function MapVirtualKey( _
            ByVal uCode As Integer, _
            ByVal uMapType As Integer) _
            As Integer
        End Function

        'GetMessageExtraInfo Function
        <DllImport("user32.dll")> _
        Private Function GetMessageExtraInfo() _
            As IntPtr
        End Function

        Public Sub SendInput(ByVal VirtualKeyCode As Short, ByVal Flag As Integer)
            Dim inputevents As New INPUT
            inputevents.type = 1
            inputevents.ki.wVk = VirtualKeyCode
            inputevents.ki.wScan = CShort(MapVirtualKey(CInt(VirtualKeyCode), 0))
            inputevents.ki.dwFlags = 0
            inputevents.ki.time = 0
            inputevents.ki.dwExtraInfo = GetMessageExtraInfo()
            SendInput(1, inputevents, Marshal.SizeOf(inputevents))
        End Sub
    End Module

    2006年11月12日 2:06

すべての返信

  • どういう時にどう シフト キー を制御したいのかがわかりませんが、
    API を使用せずとも .NET Framework では キーストロークをアプリケーションに対して送ることが可能です。

    こちらのサイトを参考にしてみてください。
    キーストロークを送信する

    2006年11月12日 8:23
  • 情報ありがとうございます。

    SendKeyクラスのSendメソッドを利用する方法も試してみたのですが、シフトキーだけを単独で制御できない(押しっぱなしにしておきたい)ため、APIを使う方法を探しています。

    何か良い方法はないでしょうか?

    2006年11月12日 21:28
  • Rickey_Rickey さん、こんにちは。

     Rickey_Rickey さんからの引用
    SendKeyクラスのSendメソッドを利用する方法も試してみたのですが、シフトキーだけを単独で制御できない(押しっぱなしにしておきたい)ため、APIを使う方法を探しています。

    ならば、SendInput 関数を使うべきでしょうね。

    2006年11月13日 0:56
  • とりあえず、INPUT構造体に、MOUSEINPUTとHARDWAREINPUTを追加してみましょう。
    2006年11月13日 2:14
    モデレータ