多年后,我偶然发现了自己的问题来回答它。
在 Flash 中粘贴是用户启动的操作之一。它必须通过右键单击并Paste
从内置上下文菜单中选择或按下CTRL+V
组合键(在 Windows 上)来启动,当InteractiveObject
(除外TextField
)处于焦点时。
如果满足这些要求,Event.PASTE
将被分派,并且在侦听器中您可以访问该Clipboard.getData()
方法。
只剩下一件事,把我带到这里寻找解决方案:Paste
当剪贴板中没有任何内容时,如何在自定义上下文菜单中禁用按钮?似乎只有一种解决方案 - 定期检查Clipboard.generalClipboard.formats.length
.
package simpletests
{
import flash.display.Sprite;
import flash.display.Stage;
import flash.events.Event;
import flash.events.FocusEvent;
import flash.events.TimerEvent;
import flash.events.MouseEvent;
import flash.ui.ContextMenu;
import flash.ui.ContextMenuItem;
import flash.desktop.Clipboard;
import flash.desktop.ClipboardFormats;
import flash.utils.Timer;
public class PasteTest extends Sprite
{
private var cont:ContextMenu;
public function PasteTest()
{
cont = new ContextMenu ();
cont.hideBuiltInItems ();
cont.clipboardMenu = true;
var timer:Timer = new Timer ( 100 );
this.contextMenu = cont;
stage.focus = stage;
timer.start ();
timer.addEventListener ( TimerEvent.TIMER, onTimer );
stage.addEventListener ( FocusEvent.FOCUS_OUT, onFocusOut );
stage.addEventListener (Event.PASTE, onPaste );
}
private function onTimer ( e:TimerEvent ):void
{
cont.clipboardItems.paste = Clipboard.generalClipboard.formats.length;
}
private function onPaste ( e:Event ):void
{
trace ( Clipboard.generalClipboard.getData(ClipboardFormats.TEXT_FORMAT) );
}
private function onFocusOut ( e:FocusEvent ):void
{
stage.focus = stage;
}
}
}
如果您想清除剪贴板以进行测试,您可能会找到错误的解决方案,例如执行如下命令:%windir%\System32\cmd /c "echo off | clip"
. 它将一个空字符串放入剪贴板,并且不会禁用上下文菜单中的“粘贴”选项。而是(在 Windows 中)剪切并粘贴文件。Paste
这将使上下文菜单中的选项变灰。