Как остановить копирование / вставку во флэш-форме - PullRequest
0 голосов
/ 27 января 2009

Я работаю в медицинской компании, занимающейся транскрипцией, и наш медицинский тест на транскрипцию, который мы назначаем нашим заявителям, - это старое приложение для создания форм, которое останавливает копирование и вставку путем очистки буфера обмена при вводе формы. Это отлично работало в IE 7, но недавно мне стало известно, что в Firefox это работает не так хорошо. Или, возможно, это версия Flash, так как Flash должен быть независимым от браузера. Я ни в коем случае не являюсь разработчиком флэш-памяти, на самом деле я довольно ужасен в этом. Так что мне нужно знать, как остановить копирование и вставку, используя скрипт действия.

Судя по комментариям, необходима дополнительная информация. Что тест на самом деле делает, он воспроизводит голосовой файл (Basic MP3), который они должны транскрибировать при прослушивании. Проблема с копированием и вставкой возникает, когда их собеседник-транскрипционист уже прошел тест и просто отправляет его по электронной почте своему другу, чтобы он мог пропустить его.

Ответы [ 6 ]

4 голосов
/ 27 января 2009

Полагаю, что поскольку это тест на отслеживание, вы отображаете некоторый исходный документ рядом с формой, которую вы хотите, чтобы пользователь заполнил на основе указанного исходного документа. Вместо того, чтобы очистить буфер обмена, не будет ли проще предотвратить копирование исходного документа? Если исходный документ также находится под контролем вашего флэш-объекта, должно быть просто установить его как доступный только для чтения и не выбираемый. Это дает дополнительное преимущество, позволяя им копировать между полями формы, так как это может быть их обычным использованием во время транскрипции и позволяет им проводить тестирование быстрее.

Обратите внимание, что ни одно подобное решение никогда не остановит кого-то, кто решителен и у него есть немного времени - если вы пытаетесь сделать что-то помимо того, чтобы помешать им обмануть этот тест, вы попадаете в DRM территория, которая является одновременно очень сложной и очень бесполезной.

0 голосов
/ 25 июля 2009
 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)  
         }     
     } 
0 голосов
/ 30 января 2009

В отсутствие event.paste в более ранних версиях flash вы, вероятно, могли бы настроить что-то вроде прослушивателя onKeyUp, который проверял нажатие клавиши V при нажатой клавише control / command. Я думаю, что это будет что-то вроде:

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

Где freakout () сделал что-то вроде очистки текстового поля или всплывающего диалогового окна с предупреждением. Это не поможет для вставки правой кнопкой мыши, но вы можете отключить контекстное меню - вы можете использовать его для большинства частей флэш-памяти, но работает ли он в текстовых полях, я не уверен.

Совершенно нецелесообразно готовить несколько слегка различных показаний, которые рандомизируются во время выполнения для выявления людей, которые могут быть склонны к мошенничеству?

0 голосов
/ 28 января 2009

Не могли бы вы зарегистрировать дескриптор события, чтобы захватить прошедшее событие в текстовом поле?

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

...

myTextField.addEventListener(Event.PASTE, onPasteMessage)

onPasteMessage может быть либо простым предупреждением для пользователя, что прошлое не разрешено, либо чем-то, что отменяет действие вставки в зависимости от того, когда событие вызывается и когда / как изменяется текстовое поле. Скорее всего, если вы захватите событие на этом уровне, вы не позволите стандартному eventHandler скопировать текст из буфера обмена в текстовое поле.

0 голосов
/ 28 января 2009

Вы, возможно, не сможете «отключить вставку» как таковую (не размещая каким-либо образом элемент управления 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, что ' был бы другой вариант.

0 голосов
/ 27 января 2009

В последнее время обновления Flash затруднили доступ к буферу обмена. Как общее практическое правило, программный доступ к буферу обмена часто не будет работать, если он не инициирован пользователем. Таким образом, код очистки буфера обмена с большей вероятностью сработает, если вы поместите его внутри вызова кнопки. Это действительно не помогает вам, но оно говорит вам, что не так, и почему то, что вы пытаетесь исправить, не может быть исправлено. Я бы предложил воспользоваться предложением rmeador.

Если это не практично, сделайте снимок экрана с текстом и используйте для текста графику. Кто-то упрямый может копировать и вставлять с небольшим усилием, но это довольно простой способ предотвратить случайное выполнение без использования флеш-формы.

Внутренне для прошивки вы можете посмотреть обработчик события вставки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...