@AAGR
Занимаюсь программированиям

Как програмно нажать на клавишу?

Я поискал в интернете и ничего хорошего не нашёл, sendkeys работаєт с сообщениями в winforms, а мне надо в консоли, просто нажать по клавиатуре, только программно.
Примечание: Не только клавишу enter, нужно как можно больше а то и все.
  • Вопрос задан
  • 976 просмотров
Пригласить эксперта
Ответы на вопрос 2
Комментировать
BasiC2k
@BasiC2k
.NET developer (open to job offers)
Вы можете использовать вызов через WinAPI keybd_event

Ниже - часть моего VB.NET проекта, на C# я думаю сами переделаете.

Module mdlKbrdEmulate
    ' Эмуляция нажатий клавиш клавиатуры

    ' Коды клавиш для эмуляции нажатий
    Public Const VK_LBUTTON = &H1       ' Левая кнопка мыши
    Public Const VK_RBUTTON = &H2       ' Правая кнопка мыши
    Public Const VK_CANCEL = &H3        ' Виртуальная клавиша Отмены, используемая для обработки комбинации клавиш Control-Break
    Public Const VK_MBUTTON = &H4       ' Средняя кнопка мыши
    Public Const VK_BACK = &H8          ' Backspace
    Public Const VK_TAB = &H9           ' Tab
    Public Const VK_CLEAR = &HC         ' 5 (на цифровой клавиатуре без Num Lock)
    Public Const VK_RETURN = &HD        ' Enter
    Public Const VK_SHIFT = &H10        ' Shift (любая)
    Public Const VK_CONTROL = &H11      ' Ctrl (любая)
    Public Const VK_MENU = &H12         ' Alt (любая)
    Public Const VK_PAUSE = &H13        ' Pause
    Public Const VK_CAPITAL = &H14      ' Caps Lock
    Public Const VK_ESCAPE = &H1B       ' Esc
    Public Const VK_SPACE = &H20        ' Spacebar
    Public Const VK_PRIOR = &H21        ' Page Up
    Public Const VK_NEXT = &H22         ' Page Down
    Public Const VK_END = &H23          ' End
    Public Const VK_HOME = &H24         ' Home
    Public Const VK_LEFT = &H25         ' Стрелка влево
    Public Const VK_UP = &H26           ' Стрелка вверх
    Public Const VK_RIGHT = &H27        ' Стрелка вправо
    Public Const VK_DOWN = &H28         ' Стрелка вниз
   '  Удалил остальные, т.к. мой ответ становится слишком большим.

    Public Const KEYEVENTF_KEYUP = &H2  ' Событие отпускания клавиши
    Public Const VK_LSHIFT = &HA0

    <DllImport("user32.dll")>
    Public Function GetKeyboardLayout(idThread As UInteger) As IntPtr
    End Function

    <DllImport("user32.dll")>
    Public Function VkKeyScanEx(ch As Char, dwhkl As IntPtr) As Short
    End Function

    <DllImport("user32.dll", CharSet:=CharSet.Auto)>
    Public Function MapVirtualKey(uCode As Integer, uMapType As Integer) As Integer
    End Function

    <DllImport("user32.dll", EntryPoint:="keybd_event", CharSet:=CharSet.Auto, ExactSpelling:=True)>
    Public Sub keybd_event(bVk As Keys, bScan As Byte, dwFlags As UInt32, dwExtraInfo As IntPtr)
    End Sub

    ' Эмуляция нажатия клавиши или набор текста
    Public Sub SetLetter(sLett As String, fCtrl As Boolean, fShift As Boolean, Optional iInt As Long = 0)
        Dim sScan1 As Byte, sScan2 As Byte, i As Integer, keyboardLayout As IntPtr = GetKeyboardLayout(0)
        Dim vKey As Short, m_LOWBYTE As Byte, sScan As Byte

        If fCtrl Then ' Нажатие Ctrl
            sScan1 = CByte(MapVirtualKey(VK_CONTROL, 0))
            keybd_event(&H11, sScan1, 0, 0)
            Call SleepMe(iInt) ' Заморозка выполнения программы
        End If

        If fShift Then ' Нажатие Shift
            sScan2 = CByte(MapVirtualKey(VK_LSHIFT, 0))
            keybd_event(&HA1, sScan2, 0, 0)
            Call SleepMe(iInt) ' Заморозка выполнения программы
        End If

        For i = 1 To Len(sLett) ' Перебираем все символы строки
            Application.DoEvents()
            If bStop Then GoTo lblEnd      ' Прерывание выполнения

            vKey = VkKeyScanEx(Mid(sLett, i, 1), keyboardLayout)
            m_LOWBYTE = vKey And &HFF               ' Get the low byte from the virtual key
            sScan = CByte(MapVirtualKey(vKey, 0))   ' Get the scan code of the key.

            keybd_event(m_LOWBYTE, sScan, 0, 0)     ' Нажатие нужной клавиши
            Call SleepMe(iInt) ' Заморозка выполнения программы
            keybd_event(m_LOWBYTE, sScan, KEYEVENTF_KEYUP, 0)
            Call SleepMe(iInt) ' Заморозка выполнения программы
        Next

lblEnd:
        If fShift Then keybd_event(&HA1, sScan2, KEYEVENTF_KEYUP, 0) ' Отжатие Shift
        If fCtrl Then keybd_event(&H11, sScan1, KEYEVENTF_KEYUP, 0) ' Отжатие Ctrl
        Call SleepMe(iInt) ' Заморозка выполнения программы
    End Sub
    ' Эмуляция нажатия спецклавиш
    Public Sub SetLetterEx(vKey As Short, fCtrl As Boolean, fShift As Boolean, Optional iInt As Long = 0)
        Dim sScan1 As Byte, sScan2 As Byte
        Dim keyboardLayout As IntPtr = GetKeyboardLayout(0)
        Dim m_LOWBYTE As Byte = vKey And &HFF               ' Get the low byte from the virtual key
        Dim sScan As Byte = CByte(MapVirtualKey(vKey, 0))   ' Get the scan code of the key.

        If fCtrl Then ' Нажатие Ctrl
            sScan1 = CByte(MapVirtualKey(VK_CONTROL, 0))
            keybd_event(&H11, sScan1, 0, 0)
            Call SleepMe(iInt) ' Заморозка выполнения программы
        End If

        If fShift Then ' Нажатие Shift
            sScan2 = CByte(MapVirtualKey(VK_LSHIFT, 0))
            keybd_event(&HA1, sScan2, 0, 0)
            Call SleepMe(iInt) ' Заморозка выполнения программы
        End If

        keybd_event(m_LOWBYTE, sScan, 0, 0) ' Нажатие нужной клавиши
        Call SleepMe(iInt) ' Заморозка выполнения программы
        keybd_event(m_LOWBYTE, sScan, KEYEVENTF_KEYUP, 0)
        Call SleepMe(iInt) ' Заморозка выполнения программы

        If fShift Then keybd_event(&HA1, sScan2, KEYEVENTF_KEYUP, 0) ' Отжатие Shift
        If fCtrl Then keybd_event(&H11, sScan1, KEYEVENTF_KEYUP, 0) ' Отжатие Ctrl
    End Sub

End Module
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы