変化を求める人

クリップボードの内容を取得してみた

      2015/07/12

何を書けばいいのかわからなくなってきた。
行動指針が見つからない。今、自分は何をしているのだろう。

毎回ボヤキから始まっているような気がしなくもないが、気を取り直して。
さて今回は、なんとなくだけどクリップボードの内容を取得してみよう。
まずはPC、その後スマホ(Android)といった感じでやってみたい。android版はこちら

PCの場合、言語は何にしようか。
とりあえず一番慣れている Java で書いてみる。

Javaの場合

Clipboardにアクセスするためには java.awt.datatransfer.Clipboard を利用する。

変更を通知するためのリスナーはない

一応FlavorListenerというものがあるが、これは「テキスト」の変更ではなく、Flavor(MIMEタイプとか)の変更を通知するリスナーらしい
そのため、どうしてもクリップボードの変更を監視したいときはループを使って一定間隔でクリップボードにアクセスする?

JavaにはリスナーがなかったのでC/C++でもやってみた。

C/C++の場合

次に C/C++。クリップボードの取得にはwin32apiを使用する。環境はVisualStudioExpress2012。

詳しくわかりやすいページがほかにあるので、そちらを見た方が早いかも。こちらのサイトとか。

大まかな説明

クリップボードの内容(テキスト)を取得する流れは、
1クリップボードを開く      OpenClipboard()
2クリップボードのハンドルを取得 GetClipboardData()
 1ハンドルをロックしてアクセス GlobalLock()
 2ハンドルのロックを解除    GlobalUnlock()
3クリップボードを閉じる     CloseClipboard()

クリップボードに文字列を書き込むには、
1クリップボードを開く      OpenClipboard()
2クリップボードを空にする    EmptyClipboard()
3クリップボードに書き込む    SetClipboardData()
4クリップボードを閉じる     CloseClipboard()
引数は省略。

サンプルコード

例えば、クリップボードの内容(テキスト)をコンソールに表示するには、

このような形になる。

変更を監視する

クリップボードの監視を行いたいときは AddClipboardFormatListener を登録する。ただし利用できるのはVista以降のみとのこと。
また、コンソールではなくウィンドウが必要になる(と思う)。コンソールのウィンドウハンドルというのも取得はできるが、WndProcを登録することができない(?)ので無理そう。

とりあえずコード。(WndProcのみ)

なお、今回アプリを作っている際、実行時エラーで若干手間取った部分があった。(文字コードとかで)
今回のエラーは個人的にメモしておきたかったが、記事の内容がぶれそう。ということで、そのエラーについては次の記事にします。

スマホ版(Android)については次回以降で。

 - C/C++ , , ,

スポンサーリンク

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

  関連記事

「>」、「<」を含む文字列をコピーしたら自動でエスケープ文字にするアプリを作った

以前、文字列置換の記事でちょこっと書いたものを実際に作ってみた。クリップボードの …

C言語(win32api)で文字列の置換。改善の余地あり

コピー → 置換 → ペースト。 ある文字列をコピーした際、既定した文字列で自動 …

Unicode?Ansi?Windowsでの文字列の表現が紛らわしい

エディットコントロールを作る際に「文字列リテラル」について考えたこと。 定義した …

エディットコントロールにクリップボードの内容を出力してみた

今回はテキスト入力を処理する「エディットコントロール」を作ってみた。 前回取得し …

クリップボードの内容を取得しよう→_crtisvalidheappointerエラーで落ちる

前回の記事でClipboardを取得する際に発生したエラーについて こちらのペー …