Visio 仅剪切/复制/粘贴形状文本

问题描述 投票:0回答:1

tl;dr 我可以在 Visio 中重新调整剪切/复制/粘贴的用途以仅传输文本吗?

我在 Visio 中有一些形状,用户经常在其上重复数据(例如:日期/时间块)。使用标准复制/粘贴方法来填充这些块很直观,从而导致无意中的形状重复。在某些情况下,形状受到保护并需要撤消才能删除,这令人沮丧。我希望能够切换

Ctrl + C/X/V
(最好还有 UI 元素)功能来传输形状文本,以避免这种挫败感。

我目前正在使用

Window.KeyUp
事件来处理此问题。这是代码的简化版本:

Private Sub vsoWindow_KeyUp(ByVal KeyCode As Long, ByVal KeyButtonState As Long, CancelDefault As Boolean)
    Dim shp as Visio.Shape: Set shp = ActiveWindow.Selection.PrimaryItem
    
    If shp is Nothing Then Exit Sub                           'Nothing is selected
    If KeyButtonState <> visKeyControl Then Exit Sub          'Ctrl isn't held
    
    Select Case KeyCode
        Case vbKeyC: CopyShapeText shp
        Case vbKeyX: CutShapeText shp                         'Doesn't work, Shape Protection intercepts
        Case vbKeyV: PasteShapeText shp
    End Select
End Sub

与模块中的工作人员一起:

Private Declare PtrSafe Function OpenClipboard Lib "User32" (ByVal hwnd As Long) As Long
Private Declare PtrSafe Function EmptyClipboard Lib "User32" () As Long
Private Declare PtrSafe Function CloseClipboard Lib "User32" () As Long
Private shpText as String

Sub CopyShapeText(shp As Visio.Shape)
    shpText = shp.Text
    ClearClipboard
End Sub

Sub CutShapeText(shp as Visio.Shape)
    shpText = shp.Text
    shp.Text = ""
    ClearClipboard
End Sub

Sub PasteShapeText(shp as Visio.Shape)
    shp.Text = shpText
End Sub

Sub ClearClipboard()
    DoEvents
    OpenClipboard 0
    EmptyClipboard
    CloseClipboard
End Sub

复制/粘贴可以工作,但相当笨重。有时,尽管

CTRL
被握住,但它不会发射。剪切不起作用,因为形状在事件触发之前就被存储了。

我尝试使用

KeyDown
事件,但这根本无法触发(检测到
CTRL
但未检测到
CTRL + C
),并且可能无法正确清除剪贴板。我也尝试使用
Application.EnterScope
但在粘贴时遇到了同样的问题并且不一致
ScopeID

最直接的方法是使用新的键盘快捷键来控制操作。这可行,但用户不喜欢它。

有办法做到这一点吗?

vba visio
1个回答
0
投票

几年前有人问过类似的问题,我对它从未得到正确的答案感到有点失望。 OP 最终使用了一种解决方案,通过利用

Document.ShapeAdded
事件来避免该问题。

同样,我决定采用简单的解决方案,并添加键盘快捷键

CTRL+Shift+C/X/V
来触发这些功能。虽然用户不喜欢测试中的快捷方式,但它似乎比使用切换键更万无一失,因为切换键不可避免地会导致错误。

虽然我的问题解决了,但我的问题却没有。出于好奇,我认为有必要知道是否可以拦截这些操作。

旁白:我最终使用

Developer > Macros
对话框来设置键盘快捷键。这可以在没有
Application.OnKey
事件的情况下以编程方式完成吗?我最终在代码中添加了注释来指示快捷方式,但直接将其放在代码中会更好。

© www.soinside.com 2019 - 2024. All rights reserved.