Flash 10RCでのクリップボード処理


ブラウザでダウンロード
swf 内でクリックを受け付ける
おそらく、クリップボードの悪用の対処と思われる現象によって、Flash 10 で
JavaScript からアクセスしたクリップボードへの書き込みが エラー #2176
によって拒否されます。(内部の初期処理イベントでもエラーになります)

よって、いままでのような呼び出し方をやめて、swf をボタンとして使う
事によって従来通りの処理を可能にします

---------------------------------------------------------------------------
● .mxml を使用せずに .as を使用しているのは、
  出来上がるファイルが格段に小さくなるからです
● MOUSE_OVER と MOUSE_OUT は使用していませんが、今後の為に実装してあります

以下のコードにはデバッグの為、firebug が組み込まれていますが、
クリップボード機能の実装には必要ありません。
package {

import flash.display.*;
import flash.events.*;
import flash.system.*;
import flash.external.*;
import flash.net.*;

public class UrlImage extends Sprite {

	private var funcName:String;

	// *********************************************************
	// コンストラクタ
	// *********************************************************
	public function UrlImage(URL:String,func:String):void {

		funcName = func;

		var loader:Loader = new Loader();

		// 読み込み完了イベントを登録
		loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadComplete);

		// 読み込み
		loader.load(new URLRequest(URL));

		firebug("UrlIamge start");

	}

	// *********************************************************
	// 読み込み完了イベント
	// *********************************************************
	private function loadComplete(e:Event):void {

		// ロードされたオブジェクトをメインの Sprite に追加
		addChild(e.target.loader);

		// 配置( 左詰め、上 )
		stage.align = StageAlign.TOP_LEFT;
		// 伸縮モード( そのまま )
		stage.scaleMode = StageScaleMode.NO_SCALE;

		// クリックイベントを登録
		this.addEventListener(MouseEvent.CLICK, mouseClick);
		// ボタン互換モード(マウスが上に来た時ハンドカーソル)
		this.buttonMode = true;

		this.addEventListener(MouseEvent.MOUSE_OVER , mouseOver);
		this.addEventListener(MouseEvent.MOUSE_OUT, mouseOut);

		firebug("loadComplete(LoaderInfo)");

	}

	// *********************************************************
	// クリックイベント
	// *********************************************************
	private function mouseClick(e:MouseEvent):void {
		try {
			var ret:String = ExternalInterface.call(
				funcName
			);
			if ( ret != "" ) {
				System.setClipboard(ret);
			}
		}
		catch(e:Error) {
			firebug(e.message);
		}
		firebug("mouseClick:"+ret);
	}

	// *********************************************************
	// マウスイベント
	// *********************************************************
	private function mouseOver(e:MouseEvent):void {
		firebug("MOUSE_OVER");
	}
	private function mouseOut(e:MouseEvent):void {
		firebug("MOUSE_OUT");
	}

	// *********************************************************
	// ログ表示
	// *********************************************************
	public function firebug(data:Object):void {
	
		ExternalInterface.call(
			"console.log", data+""
		);
	
	}

}

}
package {

import flash.display.*;

// SWF の背景色(黒)
[SWF(backgroundColor="#000000")]

// 表示用クラス 【Sprite】を継承
public class Main extends Sprite {

	// *********************************************************
	// コンストラクタ
	// *********************************************************
	public function Main():void {

		var param:Object = loaderInfo.parameters;
		var func:String = param['func'];

		var ui:UrlImage = new UrlImage("clipb.png",func);
		addChild(ui);

		ui.firebug("Main start");

	}

}

}
HTML側の記述
HTML 側が呼ばれる事になるので、SWF に対して呼ばれる関数名を渡します。
このパッケージでは、画像は固定で clipb.png ですが、ビルドしなおせば
好きな場所の好きなファイル名に変更できます。

画像のサイズに合わせて、SWF の記述を行い、実装する DIV を使って廻りを
線で囲っています。

JavaScript の関数では、IE の場合は、IE の機能を使ってコピーし、
その場合は、空文字を返して SWF 内の処理をキャンセルします。
IE 以外の場合は、クリップボードにコピーして欲しい文字列を return しています。

この仕様に沿って、メッセージボックスの表現は、「〜します」にしています。
( 自然と、キャンセルの記述も行えるでしょう )
<HTML>
<HEAD>
<META http-equiv="Content-type" content="text/html; charset=Shift_JIS">
<TITLE>WEB Flex のテスト</TITLE>
<STYLE type="text/css">
* {
	font-family: "MS Pゴシック";
	font-size: 12px;
}
BODY {
	background-color: white;
	color: black;
}
</STYLE>
<SCRIPT 
	language="javascript"
	type="text/javascript"
	src="swfobject.js">
</SCRIPT>

<SCRIPT language="javascript" type="text/javascript"> 

function GetText() {
	alert("クリップボードにコピーします   ")
	if (window.navigator.userAgent.toLowerCase().indexOf("msie") > -1) {
		window.clipboardData.setData('text', "クリップボード(IE)");   
	}
	else {
		return "クリップボード(Flash)";
	}
}

</SCRIPT> 
</HEAD>

<!-- *******************************************************
 BODY
******************************************************** -->
<BODY>

<div id="flashcontent" style='width:70;border-style:solid;border-color:gray;border-width:1px;'></div>

<script type="text/javascript">
	var so = new SWFObject(
		"setClipboard.swf?reload=" + (new Date()).getTime(),
		 "id_sample", "70", "12", "9");

	so.addVariable( "func", "GetText" );
	so.write("flashcontent");
</script>

</BODY>
</HTML>