На нажатие клавиши, пока пользовательская форма в фоновом режиме - PullRequest
1 голос
/ 23 мая 2019

Я знаю, что мы можем определить, нажата ли клавиша, например, KeyAscii = 8, однако я видел, как это делается только для событий, пока приложение пользовательской формы является окном в действии.

Возможно ли иметь окнонапример, в фоновом режиме, когда я использую IE, я могу нажать CTRL + 0 , и мое приложение распознает его и выполняет действие?

1 Ответ

1 голос
/ 23 мая 2019

По крайней мере, насколько мне известно, ответ - это невозможно, но ..


1.Вещи, которые нам нужно знать

Давайте разберемся в фактах, прежде чем приступить к кодированию:

  • Приложение не сможет выполнить какой-либо код, покаWindow объект находится в xlMinimzed состоянии
  • Таким образом, в основном, как только пользователь закроет, свернет или даже выкинет Приложения, мы больше не сможемобнаруживать любые OnKey (или любые другие) события, поскольку текущее активное приложение (т.е. браузер) имеет приоритет над приложением
    • следовательно CTRL + 0 теперь будет уменьшать масштаб страницы, так как это поведение браузера по умолчанию.
  • С учетом сказанного мы можем сделатьпо крайней мере, некоторые вещи, чтобы приблизиться, по крайней мере, к некоторой форме полезности из этого.

2.Макет приложения

Поскольку вы не предоставили конкретные сведения о приложении, я создал этот макет:

enter image description here

  • Worksheet, состоящий из одного CommandButton, который запускает UserForm1 enter image description here

    Private Sub CommandButton1_Click()
       UserForm1.Show
    End Sub
    
  • Модуль с именем Module1, который содержитпростое привет-мировое сообщение (для события OnKey)

    Public Sub hello()
       MsgBox "Hello world!"
    End Sub
    
  • И UserForm1, который содержит код для нашей OnKey обработки

    Private Sub UserForm_Activate()
    
       With ActiveWindow
           .WindowState = xlNormal
           ' we need to change window state to xlNormal
           ' xlMaximized would result in width/height property changing error
           ' and with xlMinimized our Onkey would not work
           .Width = 0
           .Height = 0
       End With
    
       Range("A1").Select
       ' we need a range selected, otherwise Application OnKey will not fire
       Application.OnKey "^0", "Module1.hello" ' launches hello world procedure
       Me.Hide
    
    End Sub
    

Теперь этого достаточно, чтобы свернуть (почти) окно и ответить на нажатие

enter image description here


3.Если мы хотим показать UserForm при сохранении функциональности

Теперь давайте предположим, что мы хотим UserForm при скрытии остальных приложений в фоновом режиме.

Для этого нам необходимо:

  1. Изменить UserForm на vbModeless

    . Для этого выберите объект UserForm и покажитесвойства ( F4 ) enter image description here

  2. Удалить строку Me.Hide из нашего UserForm1 кода

    Private Sub UserForm_Activate()
    
       With ActiveWindow
          .WindowState = xlNormal
          .Width = 0
          .Height = 0
       End With
    
       Range("A1").Select
       Application.OnKey "^0", "Module1.hello"
    
       ' Me.Hide <- remove me
    
    End Sub
    

Это оставляет нам следующую функциональность

enter image description here


Если есть какие-либо предложениядля улучшения / оптимизации я был бы рад узнать, так как этот вопрос меня немного заинтриговал.Я постараюсь держать ответ в курсе!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...