Nano Hash - криптовалюты, майнинг, программирование

vb6 подавляет нажатия клавиш с помощью API? (делаю горячую клавишу)

Я искал и не могу найти ответ, поэтому любая помощь будет оценена по достоинству.

Я хочу сделать горячую клавишу, но при нажатии горячей клавиши я не хочу, чтобы отображался фактический «персонаж», а только действие, которое необходимо выполнить.

Так, например, у меня есть это:

 Private Declare Function GetAsyncKeyState Lib "user32" _
 (ByVal vKey As KeyCodeConstants) As Long

 Private Const VK_A = &H41

 Private Sub keyboardTimer001_Timer()
    If KeyDown(VK_A) Then
       ' do my stuff, but DONT DISPLAY the letter "A"
    End If
 end sub

Так что в основном просто есть таймер (интервал 1), проверяющий асинхронную клавиатуру. Если он обнаруживает, что была нажата буква «а», я выполняю действие. Но я хочу, чтобы это было сделано БЕЗ печати буквы «а». Как удалить клавишу из буфера клавиатуры/предотвратить ее отображение? (Примечание — не уверен, что что-то вроде «PeekMessage» будет работать — если да — кто-нибудь знает, где я могу найти хороший образец кода vb6, где я могу просмотреть такие вещи, как «ctrl+a» или «ctrl+alt+a» , и т. д., и т. д., а затем просто очистить буфер и выполнить мое действие?)

Спасибо!

vb6
12.04.2020

  • Рассматривали ли вы (или пытались) установить форму KeyPreview на True и съесть нажатие клавиши в событии _KeyPress? 12.04.2020
  • да, не работает - я хочу, чтобы это работало глобально (т.е. когда форма потеряла фокус). keypreview работает только в том случае, если форма в данный момент находится в фокусе. 12.04.2020

Ответы:


1

Вы можете использовать комбинацию RegisterHotKey и PeekMessage. Следующий код определяет Key-A и Ctrl-A для выполнения действий:

Основная форма

Option Explicit

Private Done As Boolean

Private Sub Form_Activate()
   Done = False
   RegisterHotKey Me.hWnd, &HBBBB&, MOD_NONE, vbKeyA
   RegisterHotKey Me.hWnd, &HBBBA&, MOD_CONTROL, vbKeyA
   ProcessMessages
End Sub

Private Sub ProcessMessages()
   Dim Message As Msg

   Do While Not Done
      WaitMessage

      If PeekMessage(Message, Me.hWnd, WM_HOTKEY, WM_HOTKEY, PM_REMOVE) Then
         If Message.wParam = &HBBBB& Then
            MsgBox "This is my Key-A action"
         ElseIf Message.wParam = &HBBBA& Then
            MsgBox "This is my Ctrl-A action"
         End If
      End If

      DoEvents
   Loop
End Sub

Private Sub Form_Unload(Cancel As Integer)
   Done = True
   Call UnregisterHotKey(Me.hWnd, &HBBBB&)
   Call UnregisterHotKey(Me.hWnd, &HBBBA&)
End Sub

Приведенный выше код работает хорошо, но в рабочем приложении я мог бы склониться к подклассу главного окна. Если вы предпочитаете подклассы, вам нужно будет использовать метод по вашему выбору и заменить метод ProcessMessages чем-то вроде этого:

Private Function ISubclass_WindowProc(ByVal hwnd As Long, ByVal iMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
   Select Case iMsg
      Case WM_HOTKEY
         If wParam = &HBBBB& Then
            MsgBox "This is my Key-A action"
         ElseIf wParam = &HBBBA& Then
            MsgBox "This is my Ctrl-A action"
         End If
   End Select
End Function

Как видите, подклассы немного чище. Конечно, вам нужно определить материал Win API. Итак, в модуле поместите следующий код:

Модуль

Option Explicit

Public Declare Function RegisterHotKey Lib "user32" (ByVal hWnd As Long, ByVal id As Long, ByVal fsModifiers As Long, ByVal vk As Long) As Long
Public Declare Function UnregisterHotKey Lib "user32" (ByVal hWnd As Long, ByVal id As Long) As Long
Public Declare Function PeekMessage Lib "user32" Alias "PeekMessageA" (lpMsg As Msg, ByVal hWnd As Long, ByVal wMsgFilterMin As Long, ByVal wMsgFilterMax As Long, ByVal wRemoveMsg As Long) As Long
Public Declare Function WaitMessage Lib "user32" () As Long

Public Const MOD_NONE = &H0
Public Const MOD_ALT = &H1
Public Const MOD_CONTROL = &H2
Public Const MOD_SHIFT = &H4
Public Const MOD_WIN = &H8
Public Const PM_REMOVE = &H1
Public Const WM_HOTKEY = &H312

Public Type POINTAPI
   x As Long
   y As Long
End Type

Public Type Msg
   hWnd As Long
   Message As Long
   wParam As Long
   lParam As Long
   time As Long
   pt As POINTAPI
End Type
12.04.2020
  • Привет спасибо! только что заметил это - я попробую это в ближайшее время и сообщу вам результат, спасибо! да - в основном я хочу иметь возможность создавать макросы с помощью keybd_event - поэтому я не хочу, чтобы код вызывался во второй раз, пока я "ввожу" что-то... будет ли это работать с этим? (Я предполагаю, что у меня может быть просто флаг, поэтому обработка сообщений останавливается, когда я начинаю фактическое «печатать», и я снова перезапускаю, когда закончу, правильно?) спасибо! 20.04.2020
  • Я не уверен, что именно вы имеете в виду, но этот код, безусловно, сделает то, что вы просили в исходном вопросе. 20.04.2020
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..