Domanda

Lavoro per un'azienda di trascrizione medica e il nostro test di trascrizione medica che amministriamo ai nostri candidati è un'app Flash Form precedente che interrompe la copia e l'incolla svuotando gli Appunti quando si accede al modulo. Questo ha funzionato benissimo in IE 7, ma recentemente mi è venuto in mente che non funziona così bene in Firefox. O forse è la versione di Flash, poiché Flash dovrebbe essere indipendente dal browser. Non sono affatto uno sviluppatore flash, in effetti sono abbastanza terribile. Quindi quello che devo sapere è come fermare la copia e incolla usando lo script d'azione.

Sulla base dei commenti apparentemente sono necessarie alcune informazioni aggiuntive. Ciò che il test effettivamente esegue riproduce un file vocale (MP3 di base) che devono trascrivere per ascoltarlo. Il problema di copia e incolla si presenta quando il loro amico trascrittore ha già eseguito il test e lo invia per e-mail al proprio amico in modo che possano ignorarlo.

È stato utile?

Soluzione

Potrebbe non essere possibile " disabilitare incolla " come tale (senza l'hosting del controllo Flash in qualche modo te stesso, diciamo, in un'app di Windows o in un'estensione del browser di qualche tipo), ma puoi sicuramente fare una supposizione abbastanza buona sul modo in cui qualcuno sta usando l'app con un po 'basato sul timer matematica. Ecco un esempio (super) approssimativo di un'app Flex che illustra cosa intendo:

<?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>

In sostanza, è solo un timer che calcola le parole al minuto; se quel numero supera una determinata soglia, il timer si arresta e il modulo si disattiva.

Certo, non è rivestito di ferro, e se lo stessi implementando da solo, aggiungerei alcune garanzie orientate al tempismo (ad esempio, fermando il timer dopo periodi di inattività, ecc.), ma dovrebbe illustrare il punto. Sono sicuro che ci sono altre soluzioni, ma qualcosa di semplice come questo potrebbe funzionare abbastanza bene per te.


Aggiornamento: un paio di persone hanno menzionato Event.PASTE, che funzionerebbe, ma non esiste in ActionScript 2 / Flash Player 9. A condizione che tu fossi in grado di garantire Flash Player 10 e di poter scrivere in ActionScript 3, che " sarebbe un'altra opzione.

Altri suggerimenti

Presumo che dato che si tratta di un test di trascrizione, stai visualizzando alcuni documenti di origine affiancati a un modulo che desideri che l'utente compili in base a tale documento di origine. Invece di svuotare gli appunti, non sarebbe più facile impedire loro di copiare il documento di origine? Se anche il documento di origine è sotto il controllo dell'oggetto flash, dovrebbe essere semplice impostarlo come di sola lettura e non selezionabile. Ciò ha l'ulteriore vantaggio di consentire loro di copiare tra i campi del modulo, poiché potrebbe essere il loro normale utilizzo durante la trascrizione e consentire loro di testare più velocemente.

Nota che nessuna soluzione come questa potrà mai fermare qualcuno che è determinato e ha un po 'di tempo - se stai cercando di fare qualsiasi cosa oltre a impedire loro di tradire questo test, stai entrando nel DRM territorio, che è al contempo molto difficile e molto inutile.

Recentemente gli aggiornamenti di Flash hanno reso più difficile l'accesso agli Appunti. Come regola generale, gli accessi agli appunti programmatici spesso non funzionano quando non vengono avviati dall'utente. Pertanto, è più probabile che il codice di cancellazione degli Appunti funzioni se lo si inserisce in una chiamata a pulsante. Questo in realtà non ti aiuta, ma ti dice cosa è sbagliato e perché la cosa che stai cercando di risolvere non può essere risolta. Suggerirei di utilizzare il suggerimento di rmeador.

Se ciò non è pratico, fai uno screenshot del testo e usa un grafico per il testo. Qualcuno testardo potrebbe ancora copiare e incollare con un po 'di sforzo, ma questo è un modo piuttosto semplice per impedire che venga fatto casualmente senza usare un modulo flash.

Internamente per flash, potresti voler esaminare un gestore eventi incolla.

Non potresti registrare un handle di evento per catturare l'evento passato nel campo di testo?

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

...

myTextField.addEventListener(Event.PASTE, onPasteMessage)

onPasteMessage potrebbe essere un semplice avviso all'utente che il passato non è consentito o qualcosa che annulla l'azione incolla a seconda di quando viene generato l'evento e quando / come viene modificato il campo di testo. Le probabilità sono che se catturi l'evento a questo livello, impedirai all'evento predefinito Handler di copiare il testo dagli appunti nel campo di testo.

In assenza di event.paste nelle versioni precedenti di flash potresti probabilmente impostare qualcosa come un listener onKeyUp che ha verificato la pressione del tasto V con il tasto controllo / comando premuto. Immagino che andrebbe qualcosa del genere:

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

Dove freakout () ha fatto qualcosa come cancellare il campo di testo o aprire una finestra di avviso. Non sarebbe d'aiuto per incollare con il tasto destro del mouse, ma potresti essere in grado di disabilitare il menu di scelta rapida: puoi farlo per la maggior parte delle parti di Flash, ma non so se funzioni nei campi di testo.

È completamente fuori portata preparare una serie di leggermente letture diverse che vengono randomizzate in fase di esecuzione per catturare le persone che potrebbero essere inclini a imbrogliare?

 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)  
         }     
     } 
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top