Событие, где ставится application.onkey - PullRequest
0 голосов
/ 29 ноября 2018

Я хотел бы отключить ярлык кнопки Ctrl, и я нашел Application.onkeyMethod, но я не знал, где их можно разместить.

Application.onkey "^p","" работает в событии открытия рабочей книги, но это не происходит при копировании ярлыков, вырезок и т. Д.

1 Ответ

0 голосов
/ 29 ноября 2018

Попробуйте это - Вы можете поместить это в ThisWorkbook объект.

Просто вставьте все это целиком.

Это будет проходить (почти) каждый ключ и блокировать комбинацию клавишс контролем.

Это не позволит вам открыть меню справки (CTRL + F1), не позволит вам выбрать все ячейки (CTRL + A) - это не позволит вам сделать (большинство)что-нибудь с управляющим ключом.

Стоит отметить, что этот не будет блокировать такие вещи, как CTRL+SHIFT+DOWN - только такие вещи, как CTRL+A.

Это было бы относительно тривиальнодобавить эту функциональность, если вы хотите - вы просто добавите дополнительные запросы BlockKey для "^+" и "^%" и "^+%" - что-то в этом роде.

Редактировать: После написания этого я нашел похожий кодот кого-то еще здесь https://www.rondebruin.nl/win/s4/win012.htm

Private Sub Workbook_Open()
'Call DisableControlKey '<- Use this in production
Call DisableControlKey(True) 'True means show in debug window what was blocked -
End Sub

Sub DisableControlKey(Optional ShowInDebug As Boolean = False)
Dim Arr(), x
Arr = Array("{BS}", "{BREAK}", "{CAPSLOCK}", "{CLEAR}", "{DEL}", "{DOWN}", "{END}", _
            "{ENTER}", "~", "{ESC}", "{HELP}", "{HOME}", "{INSERT}", "{LEFT}", "{NUMLOCK}", _
            "{PGDN}", "{PGUP}", "{RETURN}", "{RIGHT}", "{SCROLLLOCK}", "{TAB}", "{UP}")
'Block all ascii characters from 0 to 127
For x = 0 To 127
    If ShowInDebug Then
        Debug.Print Chr(x) & ": " & BlockKey("^" & Chr(x))
    Else
        BlockKey ("^" & Chr(x))
    End If
Next x
'Block all keys on this list: https://docs.microsoft.com/en-us/office/vba/api/excel.application.onkey
For x = LBound(Arr) To UBound(Arr)
    If ShowInDebug Then
        Debug.Print Arr(x) & ": " & BlockKey("^" & Arr(x))
    Else
        BlockKey ("^" & Chr(x))
    End If
Next x
'Block all function keys
For x = 1 To 15
    If ShowInDebug Then
        Debug.Print "F" & x & ": " & BlockKey("^" & "{F" & x & "}")
    Else
        BlockKey ("^" & "{F" & x & "}")
    End If
Next x
End Sub
Function BlockKey(KeyCombo As String) As Boolean
On Error Resume Next
Application.OnKey KeyCombo, ""
BlockKey = (Err.Number = 0)
On Error GoTo 0
End Function

Вы можете увидеть, что блокируется в ближайшем окне:

Output

Теоретически, вы действительно хотите пройти через эти комбинации и очистить все, что вам не нужно ради скорости - избавитьсяиз цикла for и просто перебирайте большой массив любых комбинаций клавиш CTRL+, которые вы хотите заблокировать.

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

https://www.codeguru.com/vb/gen/vb_system/keyboard/article.php/c4829/Managing-LowLevel-Keyboard-Hooks-with-the-Windows-API.htm

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