0

私は医療転写会社で働いており、私たちが応募者に管理する医療転写テストは、フォームを入力するとクリップボードを空にすることでコピーと貼り付けを停止する古いフラッシュフォームアプリです. これは IE 7 ではうまく機能しましたが、最近、Firefox ではうまく機能しないことに気付きました。または、フラッシュはブラウザに依存しない必要があるため、フラッシュのバージョンである可能性があります。私は決して Flash 開発者ではありません。だから私が知る必要があるのは、アクション スクリプトを使用してコピー アンド ペーストを停止する方法です。

コメントに基づいて、明らかにいくつかの追加情報が必要です。テストが実際に行うことは、音声ファイル (Basic MP3) を再生し、それを聞きながら書き起こす必要があります。コピー アンド ペーストの問題は、書き起こし担当者の友人が既にテストを受けており、それを友人にメールで送信してスキップできるようにした場合に発生します。

4

6 に答える 6

4

これは書き起こしテストであるため、ソース ドキュメントと、そのソース ドキュメントに基づいてユーザーに入力してもらいたいフォームを並べて表示していると思います。クリップボードを空にするよりも、ソース ドキュメントをコピーできないようにする方が簡単ではないでしょうか? ソースドキュメントもフラッシュオブジェクトの制御下にある場合、それを読み取り専用で選択不可に設定するのは簡単です。これには、フォームフィールド間でコピーできるという追加の利点があります。これは、転記中の通常の使用法であり、テストを高速化できるためです。

このような解決策は、決心していて少し時間がある人を止めることはできないことに注意してください。このテストで不正行為を防ぐ以上のことをしようとすると、DRM の領域に入ります。非常に困難であり、非常に無駄です。

于 2009-01-27T20:29:17.190 に答える
0

貼り付け自体を「無効にする」ことはできないかもしれませんが(たとえば、Windowsアプリや何らかのブラウザ拡張機能でFlashコントロールを自分でホストしないと)、その方法については確かにかなり推測できます。誰かが少しタイマーベースの数学でアプリを使用しています。これが私が何を意味するかを説明する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>

基本的に、これは1分あたりの単語数を計算する単なるタイマーです。その数が特定のしきい値を超えると、タイマーが停止し、フォームが無効になります。

確かに、それは鉄壁ではありません。自分で実装する場合は、タイミング指向の追加の保護手段をいくつか追加します(たとえば、非アクティブな期間の後にタイマーを停止するなど)が、要点を説明する必要があります。他にも解決策があると思いますが、このような単純なもので十分に機能する可能性があります。


更新:何人かの人々がEvent.PASTEについて言及しましたが、これは機能しますが、ActionScript 2 / Flash Player9には存在しません。FlashPlayer10を確保でき、ActionScript 3でスクリプトを作成できれば、それは別のことです。オプション。

于 2009-01-27T21:32:20.213 に答える
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 に答える
0

テキストフィールドの過去のイベントをキャプチャするイベントハンドルを登録できませんでしたか?

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

...

myTextField.addEventListener(Event.PASTE, onPasteMessage)

onPasteMessage は、過去が許可されていないというユーザーへの単純な警告、またはイベントがいつ発生し、テキストフィールドがいつ/どのように変更されたかに応じて、貼り付けアクションを元に戻す何かのいずれかです。このレベルでイベントをキャプチャすると、デフォルトの eventHandler がクリップボードからテキスト フィールドにテキストをコピーするのを防ぐことができます。

于 2009-01-27T21:43:22.360 に答える
0

最近の Flash の更新により、クリップボードへのアクセスが難しくなりました。一般的な経験則として、プログラムによるクリップボードへのアクセスは、ユーザーによって開始されていない場合、機能しないことがよくあります。そのため、クリップボードをクリアするコードは、ボタン呼び出し内に配置すると機能する可能性が高くなります。これは実際には役に立ちませんが、何が問題なのか、修正しようとしているものがなぜ修正できないのかを教えてくれます。rmeador の提案を利用することをお勧めします。

それが実用的でない場合は、テキストのスクリーンショットを撮り、テキストにグラフィックを使用してください。頑固な人は、少し努力すればコピー アンド ペーストを行うことができますが、これは、Flash フォームを使用せずに気軽に行われるのを防ぐかなり簡単な方法です。

内部的にフラッシュするには、貼り付けイベント ハンドラーを調べる必要がある場合があります。

于 2009-01-27T20:38:06.907 に答える