这是我目前尝试过的代码。
Sub CauseKeyPressedEventToBeFired
oDoc = ThisComponent
oController = oDoc.getCurrentController()
oVC = oController.getViewCursor()
oForm = oDoc.getDrawpage().getForms().getByName("Form")
oTextBox = oForm.getByName("Text Box 1")
oControlView = oController.getControl(oTextBox)
oControlView.setFocus()
Dim oEvent As New com.sun.star.awt.KeyEvent
oEvent.Source = oControlView
oEvent.KeyCode = com.sun.star.awt.Key.A
oControlView.keyPressed(oEvent)
End Sub
但是,它似乎不适用于我的系统(Windows 上的 LibreOffice 6.4.3.2)。我还找到了this post,但该代码似乎也不适合我。
我搜索了com.sun.star.awt.XToolkitRobot,但它不在 API 文档中,可能是因为功能不完全支持。想必可以从com.sun.star.awt.Toolkit获取。
如需更多帮助,请在 ask.libreoffice.org 上发布问题。我建议解释你为什么要这样做,因为可能有不同的解决方案。 Ratslinger 在解决各种数据库问题方面拥有丰富的经验,他可能会指导您采用不涉及此类事件黑客的更简单的解决方案。
函数(即返回值的过程)
是的,这就是函数。但是“对象侦听器事件”意味着,我认为正确的是,我们正在讨论对象的方法。这就是 Python 或 Java 中的 LibreOffice 事件监听器,尽管在 Basic 中,它们有点奇怪,使用对象名称作为某种魔法来确定它们适用于什么。无论如何,这偏离了轨道,因为您的问题不是关于监听事件,而是关于触发它们。
编辑:
以下 Python 代码有效。我之前尝试的问题是需要设置oEvent.KeyChar,而这在Basic 中似乎不起作用。我无法想象为什么,除非我忽略了 Basic 代码中的一些明显错误。
def causeKeyPressedEventToBeFired(oEvent=None):
oDoc = XSCRIPTCONTEXT.getDocument()
oController = oDoc.getCurrentController()
oForm = oDoc.getDrawPage().getForms().getByName("Form")
oTextBox = oForm.getByName("Text Box 1")
oControlView = oController.getControl(oTextBox)
oControlView.setFocus()
oEvent = uno.createUnoStruct("com.sun.star.awt.KeyEvent")
oEvent.Source = oControlView
from com.sun.star.awt.Key import A
oEvent.KeyCode = A
oEvent.KeyChar = "a" # works in Python but strangely not in Basic
simulate_KeyPress(oEvent)
def simulate_KeyPress(oKeyEvent):
oDoc = XSCRIPTCONTEXT.getDocument()
oWindow = oDoc.CurrentController.Frame.getContainerWindow()
oKeyEvent.Source = oWindow
oToolkit = oWindow.getToolkit()
oToolkit.keyPress(oKeyEvent)
oToolkit.keyRelease(oKeyEvent)
编辑 2:
最后,这是工作的基本代码。在之前的尝试中,类型错误。
Sub CauseKeyPressedEventToBeFired
oDoc = ThisComponent
oController = oDoc.getCurrentController()
oForm = oDoc.getDrawpage().getForms().getByName("Form")
oTextBox = oForm.getByName("Text Box 1")
oControlView = oController.getControl(oTextBox)
oControlView.setFocus()
Dim oEvent As New com.sun.star.awt.KeyEvent
oEvent.KeyCode = com.sun.star.awt.Key.A
oEvent.KeyChar = CByte(97)
simulate_KeyPress(oEvent)
End Sub
Sub simulate_KeyPress(oKeyEvent As com.sun.star.awt.KeyEvent)
oWindow = ThisComponent.CurrentController.Frame.getContainerWindow()
oKeyEvent.Source = oWindow
oToolkit = oWindow.getToolkit()
oToolkit.keyPress(oKeyEvent)
oToolkit.keyRelease(oKeyEvent)
End Sub