MaxScriptTip: クリップボード操作が遅いという話

8月 15, 2016 0
MaxScriptでクリップボードを操作するには、クリップボードにテキストを送るsetClipboardTextとテキストを取得するgetClipboardTextの2つの関数を使用できます。

しかしこの2つの関数、使ってみると異常に遅いです。

どうしてこんなに遅いのか分からないのですが、数千文字送るだけで数秒程かかります。(面倒なので正確な速度計測はしていませんが…)

流石にその速度だと実用性に難があったので、色々試してみたのですが、最終的にはいつもの様に.NETを使う事にしました。
.NET万歳。
local ss = StringStream ""

-- 文字列をStringStreamに書き込み

local clipboardCls = dotNetClass "System.Windows.Forms.Clipboard"
clipboardCls.SetText (ss as string)
free ss
StringStreamを使って文字列を高速に結合した後、.NETのClipboardクラスのsetTextで転送しています。

もちろん転送データが最初から文字列な場合はそのまま転送すればいいのですが、まぁ普通はデータを整形する工程があると思うので、このタイミングで行ってしまいます。

StringStreamへの書き込みはappendを使うか、formatでtoオプションを指定します。
append ss "The text"
format "Val: %\n" theValue to:ss
これで文字列を高速にクリップボードに送る事が出来ます。
逆に文字列を取得する時は以下のようにします。
local clipboardCls = dotNetClass "System.Windows.Forms.Clipboard"
local theText = clipboardCls.GetText()
まぁWindowsアプリ用に作られた.NETですから、こういった処理はネイティブのWindowsアプリとほぼ同等の速度が出せます。