Written in Japanese(UTF-8)
2014.10.25
INASOFT


/トップ/コピペテキスト修飾除去 ダウンロード/WebHelp/ヘルプトップ

動作原理とクリップボードチェイン


※ここでは動作原理の説明のため、ネイティブなWindowsプログラミングに関する用語が登場します。
※本方式は、Windows XPまでの方式となります。Windows Vista以降では、もっとシンプルな AddClipboardFormatListener() API / RemoveClipboardFormatListener() API / WM_CLIPBOARDUPDATEメッセージ を用いる方法もあり、本ソフトがWindows Vista以降で起動された場合は、そちらの方法が用いられます。

本ソフトの主な動作である、「クリップボード内のテキストの修飾を除去する」機能の動作原理について説明します。主に、クリップボードからのデータ取出しと、クリップボードチェインについて解説することにしたいと思います。

クリップボードからのデータ取出し

クリップボードは、OSが1つだけ管理している、データ共有のためのリソースです。

例えばワープロソフトから表計算ソフトへ、文字列をコピーしたいという場合、ワープロソフト上で文字列を選択して、クリップボードへ「複写(コピー)」し、表計算ソフト上でクリップボードから「貼り付け(ペースト)」することで、ワープロソフトから表計算ソフトといったような、異なるアプリケーション間でデータのコピーをすることができます。

クリップボードを介したアプリケーション間通信

クリップボードからのデータ取出しは、ここでいう「貼り付け」に相当する操作です。

ところで、コピーする側のアプリケーション側では、「貼り付け」がどこで行われるか、あらかじめ知ることはできません。自アプリケーション内で貼り付けが行われるかもしれませんし、他アプリケーションで貼り付けが行われるかもしれません。

ワープロソフトで表ごとコピーが行われたとして、その貼り付け先が自アプリケーションならば、その表のイメージを忠実に貼り付けしたい。しかし貼り付け先が「メモ帳」ならば、表の部分を除去した純粋な(プレーン)テキストとなって貼り付けをしたい。

このため、コピーする側のアプリケーションでは、修飾付きのテキストをコピーした場合であっても、ペースト側のアプリケーションのことを考え、最低限の形式、ここではプレーンテキストの情報も、同時にクリップボードへ書き込むことになります。

「コピペテキスト修飾除去」ではこの原理を利用し、クリップボード上からはプレーンテキストの部分だけを取出し、すぐさまこのデータをクリップボードへ上書きします。これにより、テキストデータから修飾情報だけを取り除いています。

クリップボードチェイン

では、クリップボードへのコピーが行われたことを、本ソフトはどのように検知しているのでしょうか。次の2つの方法があります。

  1. 定期的に(一定時間おきに)クリップボードの読み出しを行い、変化が生じていれば、検知とする。
  2. OSからクリップボード変更通知を受け取る。

1番目については、非常に簡単な仕組みとなります。SetTimer() APIによりタイマイベントを契機にクリップボードの読み出し/検知を行えばよいことになります。本ソフトも、初期バージョンではこの方法を用いていました。

しかし、この方法には次のような問題があります。

クリップボードにアクセスできるのは、同時に1つのアプリケーションまで

そこで、2番目の方法を使うことになります。

Windowsには標準で「クリップボード ビューア」というアプリケーションが付属しています。このアプリケーションを起動しておくと分かるとおり、クリップボードへのコピーの直後には、その内容の表示が行われていることが分かると思います。

これは、このアプリケーションがOSからクリップボードの変更通知を受け取っているからです。

OSのクリップボード検知の仕組みを見てみましょう。

OSからクリップボード変更の通知を受け取るためには、SetClipboardViewer() APIで通知先のウィンドウハンドル(自分自身のウィンドウハンドル)を登録します。

しかし、クリップボード変更を受けて、SetClipboardViewer() APIで登録した全てのアプリケーションに一斉に通知が飛ぶとしたら、どうなってしまうでしょう? 1番目の方で起きた問題である「他のアプリケーションとの競合」がさらに激しく発生することになります。

そこで、「クリップボードチェイン」という仕組みが登場します。

OSはクリップボード変更を受けて、1つめ(1番最後に登録された)のアプリケーションにクリップボード変更通知を行います。1つめのアプリケーションがクリップボードの処理を終えたら、1つめのアプリケーションは2つめ(2番目に最近登録された)アプリケーションへ同じ通知をしてやります。そして2つめが3つめ、3つめが4つめ…といったふうに、数珠つなぎの要領でクリップボードの変更を通知してやります。これが、クリップボードチェインです。

SetClipboardViewer() APIは、直前に登録のあったアプリケーションのウィンドウハンドルを返しますので、ここに向かってOSから受け取ったメッセージと同じメッセージをSendMessageしてやればよいのです。

クリップボードチェインに登録されたアプリケーションが、登録順を遡るように変更通知を伝えていく

ただ、この方法にも問題点があります。

例えば、4番目に登録されたアプリケーションがフリーズしていた場合です。この場合、通知は4番目で止まってしまい、5番目のアプリケーションは通知を受け取ることができません。4番目のアプリケーションが異常終了していた場合も同様です。

これについては、定期的にクリップボードチェインの作り直し(数十秒おきに、常にクリップボードチェインの先頭に来るように再登録を行う)を繰り返すことにより、対策できます。


 目次へ
※このページは、ソフトウェアに付属のヘルプファイルをWeb用に再構築したものです。大部分に自動変換を施しているため、一部は正しく変換しきれずに表示の乱れている箇所があるかもしれませんが、ご容赦下さい。また、本ドキュメントはアーカイブドキュメントであり、内容は、右上の作成日付の時点のものとなっております。一部、内容が古くなっている箇所があるかと思いますが、あらかじめご了承下さい。
※このページへは、自由にリンクしていただいてかまいません。

■このページに関するご意見をお待ちしております → フィードバックページ

/トップ/コピペテキスト修飾除去 ダウンロード/WebHelp/ヘルプトップ