Прислушивание к входу без фокуса в Java

Этот трюк работает только в Access VBA, Excel и других не позволят. Но вы можете сделать стандартный модуль скрытым от обозревателя объектов, поставив перед именем модуля знак подчеркивания. Модуль будет виден только в том случае, если вы измените браузер объектов для отображения скрытых объектов.

Этот трюк работает с Enums во всех версиях VBA на основе vb6. Вы можете создать скрытого члена Enum, заключив его имя в квадратные скобки, а затем поставив перед ним подчеркивание. Пример:

Public Enum MyEnum
    meDefault = 0
    meThing1 = 1
    meThing2 = 2
    meThing3 = 3
    [_Min] = meDefault 
    [_Max] = meThing3 
End Enum

Public Function IsValidOption(ByVal myOption As MyEnum) As Boolean
    If myOption >= MyEnum.[_Min] Then IsValidOption myOption <= MyEnum.[_Max]
End Function

В Excel-VBA вы можете ссылаться на ячейки, заключая их в скобки, скобки также функционируют как команда оценки , позволяющая оценить синтаксис формулы:

Public Sub Example()
    [A1] = "Foo"
    MsgBox [VLOOKUP(A1,A1,1,0)]
End Sub

Также вы можете передавать необработанные данные без использования MemCopy (RtlMoveMemory), комбинируя LSet с пользовательскими типами того же размера:

Public Sub Example()
    Dim b() As Byte
    b = LongToByteArray(8675309)
    MsgBox b(1)
End Sub

Private Function LongToByteArray(ByVal value As Long) As Byte()
    Dim tl As TypedLong
    Dim bl As ByteLong
    tl.value = value
    LSet bl = tl
    LongToByteArray = bl.value
End Function

Octal & amp; Шестнадцатеричные литералы на самом деле являются беззнаковыми типами, они оба будут выводить -32768:

Public Sub Example()
    Debug.Print &H8000
    Debug.Print &O100000
End Sub

Как уже упоминалось, передача переменной в круглых скобках приводит к ее передаче ByVal:

Sub PredictTheOutput()
    Dim i&, j&, k&
    i = 10: j = i: k = i
    MySub (i)
    MySub j
    MySub k + 20
    MsgBox Join(Array(i, j, k), vbNewLine), vbQuestion, "Did You Get It Right?"
End Sub

Public Sub MySub(ByRef foo As Long)
    foo = 5
End Sub

Вы можете назначить строка непосредственно в байтовый массив и наоборот:

Public Sub Example()
    Dim myString As String
    Dim myBytArr() As Byte
    myBytArr = "I am a string."
    myString = myBytArr
    MsgBox myString
End Sub

«Mid» также является оператором. Используя его, вы перезаписываете определенные части строк без общеизвестно медленной конкатенации строк VBA:

Public Sub Example1()
    ''// This takes about 47% of time Example2 does:
    Dim myString As String
    myString = "I liek pie."
    Mid(myString, 5, 2) = "ke"
    Mid(myString, 11, 1) = "!"
    MsgBox myString
End Sub

Public Sub Example2()
    Dim myString As String
    myString = "I liek pie."
    myString = "I li" & "ke" & " pie" & "!"
    MsgBox myString
End Sub

21
задан Alex 23 May 2009 в 09:44
поделиться

3 ответа

Это нетривиальная проблема, и Java не дает вам возможности решить ее элегантно. Вы можете использовать такое решение, как предложенный банжоллинг, но даже это не будет работать все время, если ваша ошибочная мышь щелкает, например, для открытия другого полноразмерного окна, открытого в настоящее время на вашей панели задач.

Дело в том, что Java по умолчанию дает разработчикам очень небольшой контроль над ОС. Это связано с двумя основными причинами: безопасностью (как указано в документации java) и тем фактом, что разные операционные системы обрабатывают события совершенно по-разному, и создание единой модели для представления всех этих событий, вероятно, не имеет большого смысла.

Итак, чтобы ответить на ваш вопрос, я предполагаю, что вам нужно какое-то поведение для вашей программы, при котором она будет прослушивать нажатия клавиш глобально, а не только в вашем приложении. Что-то вроде этого потребует, чтобы вы получили доступ к функциям, предлагаемым вашей выбранной ОС, а для доступа к ним в Java вам нужно будет сделать это через уровень Java Native Interface (JNI).

Итак, что вы хотите сделать:

  1. Реализуйте программу на C, которая будет прослушивать глобальные нажатия клавиш в вашей ОС, если это ОС Windows, чем искать документацию по хукам Windows, которая хорошо документирована Microsoft и MSDN на Интернет и другие места. Если ваша ОС - Linux или Mac OS X, вам нужно будет прослушивать глобальные нажатия клавиш, используя библиотеки разработки X11. Это можно сделать в дистрибутиве ubunutu linux в соответствии с Howto, которое я написал на http://ubuntuforums.org/showthread.php?t=864566

  2. Подключите ваш код C к вашему коду Java через JNI. Этот шаг на самом деле самый простой. Следуйте процедуре, которую я использую в моем руководстве по адресу http://ubuntuforums.org/showthread.php?t=864566 как под Windows, так и под Linux, поскольку процедура подключения вашего кода C к вашему Java-коду будет быть одинаковыми в обеих ОС.

Важно помнить, что намного проще заставить ваш код JNI работать, если вы сначала кодируете и отлаживаете свой код C / C ++ и убедитесь, что он работает. Тогда его легко интегрировать с Java.

13
ответ дан 29 November 2019 в 20:43
поделиться

Запустите программу из командной строки в терминале и используйте Ctrl-C для ее завершения.

1
ответ дан 29 November 2019 в 20:43
поделиться

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

0
ответ дан 29 November 2019 в 20:43
поделиться
Другие вопросы по тегам:

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