Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 11.05.2012
Сообщений: 5
1

Контроль нажатия клавиш: исправить код

12.05.2012, 04:10. Показов 1256. Ответов 0
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Вот собственно код:

VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
' Импорт для "маршала"
Imports System.Runtime.InteropServices
 
' контроль нажатий клавиш в активном  пассивном режиме
Public Class Form1
    Private Sub Form1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    End Sub
    Private Const WH_KEYBOARD_LL As Integer = 13
    Private Const WM_KEYUP As Integer = &H101
    Private Shared _proc As LowLevelKeyboardProc = AddressOf HookCallback
    Private Shared _hookID As IntPtr = IntPtr.Zero
 
    Public Declare Auto Function SetWindowsHookEx Lib "user32.dll" ( _
         ByVal idHook As Integer, ByVal lpfn As LowLevelKeyboardProc, ByVal hMod As IntPtr, ByVal dwThreadId As UInteger) As IntPtr
 
    Public Declare Auto Function UnhookWindowsHookEx Lib "user32.dll" (ByVal hhk As IntPtr) As IntPtr
 
    Public Declare Auto Function CallNextHookEx _
     Lib "user32.dll" (ByVal hhk As IntPtr, ByVal nCode As Integer, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As IntPtr
 
    Public Declare Auto Function GetModuleHandle Lib "kernel32.dll" (ByVal lpModuleName As String) As IntPtr
 
    Private Shared Function SetHook(ByVal proc As LowLevelKeyboardProc) As IntPtr
        Dim curProcess As Process = Process.GetCurrentProcess()
        Dim curModule As ProcessModule = curProcess.MainModule
        Return SetWindowsHookEx(WH_KEYBOARD_LL, proc, GetModuleHandle(curModule.ModuleName), 0)
    End Function
    ' а это уже к эмулятору нажатий клавиш...
    Public Delegate Function LowLevelKeyboardProc( _
         ByVal nCode As Integer, ByVal wParam As IntPtr, _
         ByVal lParam As IntPtr) As IntPtr
    Private Declare Sub keybd_event Lib "user32.dll" _
                   (ByVal bVk As Byte, ByVal bScan As Byte, _
               ByVal dwFlags As Integer, ByVal dwExtraInfo As Integer)
    ' 
    Public Shared Function HookCallback(ByVal nCode As Integer, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As IntPtr
        If nCode >= 0 And wParam = CType(WM_KEYUP, IntPtr) Then
            Dim vkCode As Keys = CType(Marshal.ReadInt32(lParam), Keys)
            ' клавиша, посе нажатия которой происходит событие
            If vkCode = Keys.Oemtilde Or vkCode = Keys.Oemtilde Then
                ' а здесь собственно происходит реакция после нажатия определенной клавиши
                Clipboard.SetText("test text, в дальнейшем скорее всего будет переменная типа String")
                ' эмулируется клавиша Back для стирания одного символа, поскольку реакция идет на "символьную" клавишу
                ' это событие проходит на ура: нажимаем "~", происходит перехват события
                ' keybd_event(8, 0, 0, 0) "стирает" тильду..., и вот дальше проблема... 
                keybd_event(8, 0, 0, 0)
                ' это должно по идеии эмулировать нажатие клавиш Ctrl + V, но вместо этого происходит "Зажим" клавиши Ctrl 
                ' тоесть происходит "нажатие" Ctrl а V почему-то нет....
                ' и вот эта Ctrl так и остаеться "нажатой", пока ее не отожмешь вручную....
                keybd_event(17, 86, 0, 0)
                ' эта строчка эмулирует нажатие V , текст вставляется в онкно но отжатие Ctrl не происходит..
                'SendKeys.SendWait("{V}")
                ' а вот если дописть 
                ' keybd_event(17, 86, 86, 86)
                ' то вставка данных происходит и отжатие тоже, но вместо текста получаеться всякая тарабаршина
 
            End If
        End If
        Return CallNextHookEx(_hookID, nCode, wParam, lParam)
    End Function
 
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        _hookID = SetHook(_proc)
    End Sub
    Declare Auto Function FindWindow Lib "USER32.DLL" (ByVal lpClassName As String, ByVal lpWindowName As String) As IntPtr
    Declare Auto Function SetForegroundWindow Lib "USER32.DLL" (ByVal hWnd As IntPtr) As Boolean
End Class

В коде программы есть коментарии, в которых я описал проблему...
Притом ставил заместо Ctrl драгие они тоже "зажимаються"
Кде я накосячил?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
12.05.2012, 04:10
Ответы с готовыми решениями:

Имитация нажатия клавиш
здравствуйте. нужно сделать программу, которая при запуске эмулировала бы вначале нажатие shift+tab, затем пробел, после чего...

Как имитировать нажатия клавиш
Вот например программа должна нажимать клавиши например: Q и подержать сек 5 потом W с подержать сек 8 и так далее

Отлов нажатия клавиш на форме
Отлавливались нажатия на клавиши на форме (Handles Me.KeyDown). После добавления на форму текстового поля и кнопки, отлов прекратился. Куда...

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.05.2012, 04:10
Помогаю со студенческими работами здесь

Отлавливание нажатия клавиш за пределами формы
Я могу захватывать клавиши и записывать их в текст бокс. Но как например за пределами формы их захватывать? Например в блокноте пишешь и...

Эмуляция нажатия клавиш в полноэкранных приложениях
Эмулирую нажатие клавиши так: Dim kb As New Devices.Keyboard ... kb.SendKeys("q") kb.SendKeys("Q") Когда фокус находится на...

Отслеживание нажатия клавиш в пределах формы
У меня при нажатии на кнопку D картинка двигается: Private Sub Form1_KeyPress(ByVal sender As Object, ByVal e As...

Глобальный Hook - отлов нажатия одной из клавиш
Добрый вечер! Извините за ламерский вопрос. Проблема заключается в следующем. Мне нужно что бы программа глобально отзывалась на одну из...

Отлов нажатия клавиш. Не отлавливает русские символы
Существует выборка Case 65 To 90 If Control.IsKeyLocked(Keys.CapsLock) Or (Control.ModifierKeys And Keys.Shift)...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему

Редактор формул (кликните на картинку в правом углу, чтобы закрыть)
Новые блоги и статьи
Неблокируемый стек в C++26: реализуем простой сборщик мусора
stackOverflow 02.03.2025
Многопоточные приложения требуют надежных и производительных структур данных, способных эффективно работать в условиях конкурентного доступа. Неблокируемые структуры данных представляют собой особый. . .
Шаблон REQ/REP в ZeroMQ: сверхбыстрый обмен сообщениями в C++ и Python
stackOverflow 02.03.2025
Построение высоконагруженных распределенных систем требует надежного и производительного механизма обмена сообщениями. ZeroMQ выделяется среди прочих решений своей невероятной скоростью работы и. . .
Нестандартные приемы работы с итераторами в C++
stackOverflow 02.03.2025
Итераторы - один из краеугольных камней C++, предоставляющий универсальный механизм обхода и манипуляции данными в контейнерах. Появившись как замена небезопасным указателям, они эволюционировали от. . .
Лексический анализ и регулярные выражения в C++26
stackOverflow 02.03.2025
Лексический анализ - ядро любого компилятора и инструмента обработки текста. Каждый программист сталкивается с задачами парсинга строк, обработки файлов конфигурации или анализа пользовательского. . .
Подробно о std::mdspan в C++23
stackOverflow 02.03.2025
Работа с многомерными массивами данных традиционно была одной из сложных задач в C++. Программистам приходилось создавать собственные абстракции или использовать сторонние библиотеки для эффективной. . .
Колмогоровская сложность в C++: Путь к совершенному коду
stackOverflow 02.03.2025
Абстрактная математическая теория Колмогорова стала мощным средством оценки и улучшения программного кода. Сложность алгоритма - не только в его вычислительной эффективности, но и в том, насколько. . .
Изменения в C# 14
stackOverflow 02.03.2025
Одно из самых значимых изменений в C# 14 - поддержка коллекционных выражений, которые позволяют создавать и инициализировать коллекции с помощью нового лаконичного синтаксиса. Это нововведение. . .
Разработка кроссплатформен­­­­ного мобильного приложения для iOS/Android на C++
bytestream 02.03.2025
C++ как язык программирования высокого уровня с прямым доступом к аппаратным ресурсам позволяет создавать приложения, работающие одинаково быстро как на iOS, так и на Android устройствах. Ни для кого. . .
Аутентификация/авторизация на Golang
bytestream 02.03.2025
Go предлагает множество возможностей для создания надежных систем аутентификации. Встроенные криптографические пакеты, высокая производительность и простота параллельной обработки запросов делают его. . .
Нововведения TypeScript 5.8
bytestream 02.03.2025
TypeScript 5. 8 приносит много возможностей и оптимизаций, которые существенно расширяют границы типобезопасного программирования на JavaScript. Эта версия включает ряд значительных улучшений в работе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru