如何以flash形式停止复制/粘贴

时间:2009-01-27 20:23:53

标签: flash actionscript copy-paste

我为医疗转录公司工作,我们为申请人管理的医疗转录测试是一个较旧的Flash表单应用程序,当您输入表单时,通过清空剪贴板来停止复制和粘贴。这在IE 7中运行得很好,但最近我注意到它在Firefox中运行得不好。或者它可能是flash的版本,因为flash应该与浏览器无关。我绝对不是一个Flash开发者,事实上我对它非常可怕。所以我需要知道的是如何使用动作脚本停止复制和粘贴。

根据评论显然,一些额外的信息是必要的。测试实际上是什么,它播放一个语音文件(基本MP3),他们必须转录为听取它。当他们的转录伙伴已经参加测试并且只是通过电子邮件发送给他们的朋友以便他们可以跳过它时,就会出现复制和粘贴问题。

6 个答案:

答案 0 :(得分:4)

我认为,因为这是一个trascription测试,所以您将根据所述源文档将您希望用户填写的表单并排显示一些源文档。而不是清空剪贴板,是否更容易阻止它们复制源文档?如果源文档也受flash对象的控制,则应将其设置为只读且不可选。这具有允许它们在表单字段之间复制的额外好处,因为这可能是它们在转录期间的正常使用并允许它们更快地进行测试。

请注意,没有这样的解决方案永远不会阻止那些有决心且有一点时间的人 - 如果你试图做任何事情,除了防止他们在这个测试中作弊,你就会进入DRM领土,这既困难又非常徒劳。

答案 1 :(得分:0)

最近,Flash更新使访问剪贴板变得更加困难。作为一般经验法则,程序化剪贴板访问通常在不由用户启动时无法工作。因此,如果将剪贴板清除代码置于按钮调用中,则剪贴板清除代码更有可能发挥作用。这对你没有帮助,但它确实告诉你出了什么问题,以及为什么你要修复的东西无法修复。我建议使用rmeador的建议。

如果这不切实际,请截取文字截图并使用图形作为文字。顽固的人仍然可以通过一些努力来复制和粘贴,但这是一种相当简单的方法来阻止它在不使用闪存形式的情况下随意进行。

在内部闪存,您可能需要查看粘贴事件处理程序。

答案 2 :(得分:0)

你可能无法“禁用粘贴”(没有自己托管Flash控件,比如说,在Windows应用程序中,或在某种类型的浏览器扩展中),但你当然可以做出相当不错的猜测关于某人使用该应用程序的方式与一些基于计时器的数学。这是一个Flex应用程序的(超级)粗略示例,说明了我的意思:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" xmlns:local="*" creationComplete="this_creationComplete(event)">

    <mx:Script>
        <![CDATA[

            private var timer:Timer;
            import flash.events.Event;

            private function this_creationComplete(event:Event):void
            {
                timer = new Timer(1000);
                timer.addEventListener(TimerEvent.TIMER, timer_tick);
                timer.start();
            }

            private function timer_tick(event:TimerEvent):void  
            {
                var elapsedTimeInMinutes:Number = timer.currentCount / 60;
                var averageWordLength:Number = 4;
                var humanlyPossible:Number = 200;

                var thisPersonsSpeed:Number = (txtTest.text.length / averageWordLength) / elapsedTimeInMinutes;

                if (thisPersonsSpeed > humanlyPossible)
                {
                    txtSpeed.text = "Wait, " + Math.floor(thisPersonsSpeed).toString() +  " words per minute?  This clown is probably cheating.";
                    txtTest.enabled = false;
                    timer.stop();
                }
                else
                {
                    txtSpeed.text = "Currently typing " + Math.floor(thisPersonsSpeed).toString() + " wpm.  Hurry up!  Faster!";
                }
            }

        ]]>
    </mx:Script>    

    <mx:VBox>
        <mx:TextArea id="txtTest" width="600" height="300" />
        <mx:Text id="txtSpeed" />
    </mx:VBox>

</mx:Application>

基本上,它只是一个计算每分钟单词的计时器;如果该数字超过某个阈值,则计时器停止,表单将禁用。

当然,它不是铁壳,如果我自己实施它,我会在一些额外的面向时间的安全措施(例如,在不活动时间后停止计时器等),但它应该说明点。我确信还有其他解决方案,但这样简单的事情对你来说可能已经足够了。


更新:有几个人提到了Event.PASTE,它可以工作,但在ActionScript 2 / Flash Player 9中不存在。只要你能够确保Flash Player 10并且可以在ActionScript 3中编写脚本,那就是' d是另一种选择。

答案 3 :(得分:0)

您是否无法注册事件句柄以捕获文本字段上的过去事件?

function onPasteMessage(event:Event){ ... }

...

myTextField.addEventListener(Event.PASTE, onPasteMessage)

onPasteMessage可以是对用户的简单警告,即不允许过去,也可以根据事件被触发的时间以及修改文本字段的时间来撤消粘贴操作。如果您在此级别捕获事件,则可能会阻止默认的eventHandler将文本从剪贴板复制到文本字段。

答案 4 :(得分:0)

如果在早期版本的flash中没有event.paste,你可能会设置类似onKeyUp监听器的东西,它会在按下控制/命令键的情况下检查是否按下了V键。我猜它会像:

var listening_object = new Object();
Key.addListener(listening_object);
listening_object.onKeyUp(){
  if ( Key.getCode() == whatevercodeforVis && Key.isDown(Key.CONTROL)){
    freakout();
  }
}

freakout()执行清除文本字段或弹出警告对话框的操作。 右键单击粘贴无济于事,但您可以禁用上下文菜单 - 您可以对闪存的大多数部分进行操作,但是它是否适用于文本字段我不确定。

准备一些略微的不同读数是否完全超出范围,这些读数会在运行时被随机化以找出可能会欺骗的人?

答案 5 :(得分:0)

 package {  
     import flash.desktop.Clipboard;  
     import flash.desktop.ClipboardFormats;  
     import flash.display.MovieClip;  
     import flash.display.Sprite;  
     import flash.events.Event;  
     import flash.ui.ContextMenu;    
     public class PasteExample extends MovieClip {  

         public function PasteExample():void {  
             //make a movie
             var pasteTarget:Sprite = addChild(new Sprite()) as Sprite;  
             pasteTarget.graphics.beginFill(0);  
             pasteTarget.graphics.drawRect(0, 0, 100, 100); 
             pasteTarget.endFill();

             var contextMenu:ContextMenu = new ContextMenu();  
             contextMenu.clipboardMenu = true;
             contextMenu.clipboardItems.paste = true;  
             pasteTarget.contextMenu = contextMenu;  

             pasteTarget.addEventListener(Event.PASTE,pasteHandler)  
         }  

         private function pasteHandler(e:Event):void {  
             var clipboadStr:String =  Clipboard.generalClipboard.getData(ClipboardFormats.TEXT_FORMAT) as String;  
             trace(clipboadStr)  
         }     
     }