クリップボードの内容を取得してみた
2015/07/12
何を書けばいいのかわからなくなってきた。
行動指針が見つからない。今、自分は何をしているのだろう。
毎回ボヤキから始まっているような気がしなくもないが、気を取り直して。
さて今回は、なんとなくだけどクリップボードの内容を取得してみよう。
まずはPC、その後スマホ(Android)といった感じでやってみたい。android版はこちら
PCの場合、言語は何にしようか。
とりあえず一番慣れている Java で書いてみる。
Javaの場合
Clipboardにアクセスするためには java.awt.datatransfer.Clipboard を利用する。
1 2 3 4 5 6 7 8 |
// Clipboardのインスタンスを取得 Clipboard clip = Toolkit.getDefaultToolkit().getSystemClipboard(); // Clipboardからテキストを取得 String text = (String)clip.getData(DataFlavor.stringFlavor); // Clipboardにテキストを書き込む StringSelection ss = new StringSlection("てきすと"); clip.setContents(ss,ss); |
変更を通知するためのリスナーはない
一応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()
引数は省略。
サンプルコード
例えば、クリップボードの内容(テキスト)をコンソールに表示するには、
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
HANDLE hClip; // HANDLE char* pStr; // ロックしたハンドルにアクセスするためのもの // クリップボードを開く // コンソールに表示するので引数はNULLでいい OpenClipboard(NULL); // ハンドル取得 // テキストデータを取得するので CF_TEXT を指定 hClip = GetClipboardData(CF_TEXT); if(hClip != NULL){ // ハンドルを使うときはロック pStr = (char*)GlobalLock(hClip); // 表示 printf("%s\n",pStr); // ロック解除 GlobalUnlock(hClip); } // クリップボードを閉じる CloseClipboard(); |
このような形になる。
変更を監視する
クリップボードの監視を行いたいときは AddClipboardFormatListener を登録する。ただし利用できるのはVista以降のみとのこと。
また、コンソールではなくウィンドウが必要になる(と思う)。コンソールのウィンドウハンドルというのも取得はできるが、WndProcを登録することができない(?)ので無理そう。
とりあえずコード。(WndProcのみ)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
LRESULT CALLBACK WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam){ switch(uMsg){ case WM_CREATE: // ウィンドウハンドルを登録 AddClipboardFormatListener(hwnd); return 0; case WM_DESTROY: // 登録解除 RemoveClipboardFormatListener(hwnd); return 0; case WM_CLIPBOARDUPDATE: /* ここでClipboardの内容を取得すれば変更後の値を取得できる */ return 0; } return DefWindowProc(hwnd, uMsg, wParam, lParam); } |
なお、今回アプリを作っている際、実行時エラーで若干手間取った部分があった。(文字コードとかで)
今回のエラーは個人的にメモしておきたかったが、記事の内容がぶれそう。ということで、そのエラーについては次の記事にします。
スマホ版(Android)については次回以降で。
関連記事
-
「>」、「<」を含む文字列をコピーしたら自動でエスケープ文字にするアプリを作った
以前、文字列置換の記事でちょこっと書いたものを実際に作ってみた。クリップボードの …
-
C言語(win32api)で文字列の置換。改善の余地あり
コピー → 置換 → ペースト。 ある文字列をコピーした際、既定した文字列で自動 …
-
Unicode?Ansi?Windowsでの文字列の表現が紛らわしい
エディットコントロールを作る際に「文字列リテラル」について考えたこと。 定義した …
-
エディットコントロールにクリップボードの内容を出力してみた
今回はテキスト入力を処理する「エディットコントロール」を作ってみた。 前回取得し …
-
クリップボードの内容を取得しよう→_crtisvalidheappointerエラーで落ちる
前回の記事でClipboardを取得する際に発生したエラーについて こちらのペー …
スポンサーリンク
週間人気記事
AndroidStudioでコピペする方法。デフォルトではクリップボードから貼り付けできない
Android Serviceのメモ。onBind,onRebind,onUnbindが呼ばれる条件
[Win]+[Print]知らなかった。スクショってそのまま保存出来たんだ。