Ruby


クリップボードの内容の表示

今回はクリップボードの中身(テキストデータ)を取得し、 それを表示するプログラムを作ります。これは、クリップボードの中身を取得し それを活用するプログラムのサンプルになると思います。
これまであなたはどのようにしてプログラムにデータを送りましたか?
コマンドラインからの入力?コマンドライン引数?WindowsMessage?それともネットワークを介した やり取りでしょうか?
方法はいろいろありますよね。 今回の方法があなたの幅を広げるものになれば幸いです。

001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 020 021 022 023 024 025 026 027 028 029 030 031 032 033 034 035 036 037 038

#! ruby -Ks #2009/11/1 Shirao #クリップボードの内容を表示するプログラム require "Win32API" #クリップボード操作モジュール module Clipboard #クリップボード操作関数群 $OpenClipboard = Win32API.new("user32", "OpenClipboard", ["I"], "I"); $CloseClipboard = Win32API.new("user32", "CloseClipboard", [], "I"); $GetClipboardData = Win32API.new("user32", "GetClipboardData", ["I"], "I"); #メモリ操作関数群 $GlobalLock = Win32API.new("kernel32", "GlobalLock", ["I"], "P"); $GlobalUnlock = Win32API.new("kernel32", "GlobalUnlock", ["I"], "I"); CF_TEXT = 1 #他にもいろいろ #テキスト取得メソッド def self.getText clpdata = "" while $OpenClipboard.Call(0) == 0 #開くまで座して待て sleep 1 end begin if(h = $GetClipboardData.Call(CF_TEXT))!=0 #ある? if p = $GlobalLock.Call(h) #ロックして取り出すべし clpdata = p; $GlobalUnlock.Call(h); end end ensure $CloseClipboard.Call end return clpdata; end end

ポイント

Win32

5行目のrequire 'Win32API'はWin32APIを使うときに書くものだと 思っておいてください。詳しく知りたい場合はRubyのマニュアルを見てください。
Win32APIについては、Windows環境におけるC++プログラミング(WindowsPrograming) について調べてみてください。気になったらMSDNなどを当たってみると良いかと思います。

$

$〜の宣言が並んでいますが、$〜はグローバル変数を表します。 グローバルじゃなくてもいいかもですが、ここではグローバルで行くことにしました。

Win32.new

Rubyのマニュアルによると、メソッドWin32.newの形式は
Win32API.new(dllname, proc, import, export)
で、機能は以下のよう解説されています。
DLL dllname をロードし、 API関数 proc のオブジェクトを生成します。 import には proc の引数の型のリストを、 export には proc の戻り値の型を指定します。
なお、PはPointer、Lはlong、Iはint、Vはvoidを表しています。

Call

APIを呼び出すにはCallメソッドを使います。引数はAPIに渡す引数です。

CF_TEXT

今回はクリップボードのデータをテキストとして取り出したかったのでCF_TEXTを 定義しました。別の形式(たとえば画像)で取り出したいならばそれ用の定数を宣言すべきです。 詳しくはWeb上で調べてみてください。クリップボードの操作関連のページを参照すると 記述されていたかと思います。

付録

応用

これを用いると入力として容易にクリップボードを使うことができることがわかりました。 では、これを何に生かせるでしょうか。これの利点は、いちいちコマンドラインや入力フォームに記述しなくても データを自動的に受け渡すことができることです。しかし、起動した瞬間に読み取って何かを実行してもうまみは少ないです。
これが向いているのは反復的にデータを、それも定型的なデータを受け渡し、それを用いてもしくはそれに対して処理を 行う場合です。
たとえばダウンローダなんてどうですか?クリップボードに収集されるたびにダウンロードする形式の。 これを作るときは、前回と違うものが取得されたかなどの判定を行うことが必要となるでしょう。 もし、作るならばどの程度の複雑なサイト(形式)からのダウンロードができるかなどががんばりどころだと思います。 いいのができたらぜひ公開してくださいね。
ほかにもいろいろ考えてみると楽しいかもしれません。

そのうち書く事

さて、応用を考えるときに、クリップボードの内容を読んで、処理し、 それをクリップボードに書き込めると便利だと思いませんでしたか? じつはそれもそれなりの手間でできるのです。これについてはそのうち書きたいと思います。 いますぐ作りたいという熱意あふれる方は、SetClipboardDataについて調べてみるといいと思います。

ソース・入力ファイル

今回のRubyソースコードをおいておきます。


プログラムに戻る