0

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

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

4

6 回答 6

4

我假设由于这是一个转录测试,因此您将一些源文档与您希望用户根据所述源文档填写的表单并排显示。与其清空剪贴板,阻止他们复制源文档不是更容易吗?如果源文档也在您的 Flash 对象的控制之下,将其设置为只读和不可选择应该很简单。这具有允许他们在表单字段之间复制的额外好处,因为这可能是他们在转录期间的正常使用,并允许他们更快地进行测试。

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

于 2009-01-27T20:29:17.190 回答
0

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

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

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

于 2009-01-27T20:38:06.907 回答
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 中编写脚本,那就另当别论了选项。

于 2009-01-27T21:32:20.213 回答
0

您不能注册一个事件句柄来捕获文本字段上的过去事件吗?

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

...

myTextField.addEventListener(Event.PASTE, onPasteMessage)

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

于 2009-01-27T21:43:22.360 回答
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();
  }
}

fractout() 做了一些事情,比如清除文本字段或弹出一个警告对话框。右键单击粘贴无济于事,但您可能可以禁用上下文菜单 - 您可以在大部分 Flash 中使用,但我不确定它是否适用于文本字段。

准备一些在运行时随机分配的略有不同的读数以找出可能倾向于作弊的人是否完全超出了范围?

于 2009-01-30T11:09:48.310 回答
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)  
         }     
     } 
于 2009-07-24T23:54:32.320 回答