Pregunta

Trabajo para una empresa de transcripción médica y nuestra prueba de transcripción médica que administramos a nuestros solicitantes es una aplicación de formularios flash más antigua que deja de copiar y pegar al vaciar el portapapeles cuando ingresa el formulario. Esto funcionó muy bien en IE 7, pero recientemente me ha llamado la atención que no funciona tan bien en Firefox. O tal vez es la versión de flash, ya que flash debe ser independiente del navegador. No soy de ninguna manera un desarrollador flash, de hecho, soy bastante terrible en eso. Entonces, lo que necesito saber es cómo detener la copia y pegar usando el script de acción.

Según los comentarios, aparentemente se necesita información adicional. Lo que la prueba realmente hace es reproducir un archivo de voz (MP3 básico) que tienen que transcribir mientras lo escuchan. El problema de copiar y pegar aparece cuando su amigo transcriptor ya ha realizado la prueba y solo se la envía por correo electrónico a su amigo para que puedan saltearla.

¿Fue útil?

Solución

Es posible que no pueda " deshabilitar pegar " como tal (sin alojar el control Flash de alguna manera, por ejemplo, en una aplicación de Windows o en una extensión de navegador de algún tipo), pero ciertamente puede adivinar bastante bien la forma en que alguien está usando la aplicación con un poco basado en temporizador mates. Aquí hay un ejemplo (súper) aproximado de una aplicación Flex que ilustra lo que quiero decir:

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

Esencialmente, es solo un temporizador que calcula palabras por minuto; si ese número excede un cierto umbral, el temporizador se detiene y el formulario se desactiva.

Claro, no está revestido de hierro, y si lo estuviera implementando yo mismo, aplicaría algunas garantías adicionales orientadas al tiempo (por ejemplo, detener el temporizador después de períodos de inactividad, etc.), pero debería ilustrar el punto. Estoy seguro de que hay otras soluciones, pero algo simple como esto puede funcionar bastante bien para usted.


Actualización: un par de personas han mencionado Event.PASTE, que funcionaría, pero no existe en ActionScript 2 / Flash Player 9. Siempre que pudieras asegurarte de Flash Player 10 y pudieras escribir en ActionScript 3, eso ' d ser otra opción.

Otros consejos

Supongo que, dado que se trata de una prueba de trascripción, está mostrando un documento fuente junto con un formulario que desea que el usuario complete en función de dicho documento fuente. En lugar de vaciar el portapapeles, ¿no sería más fácil evitar que copien el documento fuente? Si el documento fuente también está bajo el control de su objeto flash, debería ser simple configurarlo como de solo lectura y no seleccionable. Esto tiene el beneficio adicional de permitirles copiar entre campos de formulario, ya que ese puede ser su uso normal durante la transcripción y permitirles realizar pruebas más rápido.

Tenga en cuenta que ninguna solución como esta detendrá a alguien que esté determinado y tenga un poco de tiempo: si está tratando de hacer algo más que evitar que haga trampa en esta prueba, está entrando en DRM territorio, que es muy difícil y muy inútil.

Recientemente, las actualizaciones de Flash han dificultado el acceso al portapapeles. Como regla general, los accesos programáticos al portapapeles a menudo no funcionarán cuando el usuario no los inicie. Por lo tanto, es más probable que el código de limpieza del portapapeles funcione si lo coloca dentro de una llamada de botón. Esto realmente no te ayuda, pero sí te dice qué está mal y por qué no se puede arreglar lo que estás tratando de arreglar. Sugeriría hacer uso de la sugerencia de rmeador.

Si eso no es práctico, tome una captura de pantalla del texto y use un gráfico para el texto. Alguien obstinado aún podría copiar y pegar con un poco de esfuerzo, pero esta es una forma bastante simple de evitar que se haga de manera casual sin usar un formulario flash.

Internamente para flashear, es posible que desee buscar en un controlador de eventos de pegado.

¿No podría registrar un identificador de evento para capturar el evento pasado en el campo de texto?

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

...

myTextField.addEventListener(Event.PASTE, onPasteMessage)

onPasteMessage podría ser una simple alerta al usuario de que el pasado no está permitido o algo que deshace la acción de pegar dependiendo de cuándo se dispara el evento y cuándo / cómo se modifica el campo de texto. Lo más probable es que si captura el evento en este nivel, evitará que el administrador de eventos predeterminado copie el texto del portapapeles al campo de texto.

En ausencia de event.paste en versiones anteriores de flash, probablemente podría configurar algo como un oyente onKeyUp que verificó si se presionó la tecla V con la tecla control / comando presionada. Supongo que sería algo así como:

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

Donde freakout () hizo algo como borrar el campo de texto o abrir un cuadro de diálogo de advertencia. No sería útil para pegar con el botón derecho, pero es posible que pueda deshabilitar el menú contextual; puede hacerlo para la mayoría de las partes del flash, pero no estoy seguro de si funciona en campos de texto.

¿Está completamente fuera de alcance preparar una serie de lecturas ligeramente diferentes que se aleatorizan en el tiempo de ejecución para atrapar a las personas que podrían estar inclinadas a hacer trampa?

 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)  
         }     
     } 
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top