TextCopyのソースの整理が終わったので公開させていただきます。
→ テキストがコピー出来たかどうかの確認も出来る TextCopy
【ダウンロード】
TextCopyのソース(823KB)
◆IMEのオン/オフ◆
TextCopyではキー入力をエミュレートするという方法でクリップボードへのコピーを実現しているため、最初にIMEをオフし、最後にIMEをオンに戻す必要があります。
IMEのオン/オフを行うにはImmSetopenStatusを使います。
ImmSetOpenStatus(NULL, FALSE) // IMEオフ
ImmSetOpenStatus(NULL, TRUE) // IMEオン
→ MSDN Library:ImmSetOpenStatus
ATOKのオン/オフを行うには、さらにレジストリの書き換え、常駐監視も必要となってくるのですが、それはAtokChangerのソースを公開させていただいた時にご説明致します。
◆キー入力のエミュレート◆
先ほども書いたようにTextCopyではキー入力をエミュレートすることでクリップボードへのコピーを行っているのですが、それを実現する関数がkeybd_eventです。
例えば、
keybd_event(0x11, 0, 0, 0); // down
keybd_event(0x43, 0, 0, 0); // down
keybd_event(0x43, 0, KEYEVENTF_KEYUP, 0); // up
keybd_event(0x11, 0, KEYEVENTF_KEYUP, 0); // up
これでCTRLキーとCキーを押した状態、つまり「コピー」が出来ます。
→ MSDN Library:keybd_event
keybd_eventは第1引数にエミュレートしたいキーコード、第3引数にどの状態をエミュレートするかを指定します。
0x11は「CTRL」、0x43は「C」のキーコードを表しています。
各キーコードはこちらのページが参考になります。
こちらのページに書かれてあるのはWindowsの場合なので、WindowsMobileの場合と少し異なる部分もあります。
また、Gzhさんがキーコード調査用ツールを公開して下さっていますので、そちらで調べるのもいいと思います。(私もよく利用させてもらってます)
→ NICQUE Freeware:PQz_CHECK
キーの場合もマウスと同様に「押し込む→離す」で1動作となりますので、1回キーをエミュレートするためにはdownとupの2行必要になります。
keybd_event(0x11, 0, 0, 0); // down
keybd_event(0x11, 0, KEYEVENTF_KEYUP, 0); // up
今回の場合は「CTRL+C」キーのエミュレートをしているわけですが、その場合にどのような順番でキーコードが発行されているかをPQz_CHECKで見てみると、
(最初の0x11はCTRLキーを押した時のものなので、その次にCキーを押した時に表示されたものがCTRL+Cキーとして発行されたキーコードです)
という感じになるので、この通りにkeybd_eventでキーコードを発行させることにより、「CTRL+C」をエミュレートすることが出来ます。
◆クリップボードの操作◆
クリップボードを操作する前にはOpenClipboard、操作する前にはEmptyClipboardで中身を空にして、操作し終えたら必ずCloseClipboardでクリップボードを閉じて下さい。
今回はキーエミュレートでクリップボードに内容をコピーしているので、それ程神経質になることはありませんが、ちゃんとCloseClipboardをしないとシステムに不具合が生じる可能性はあると思います。
→ MSDN Library:OpenClipboard
→ MSDN Library:EmptyClipboard
→ MSDN Library:CloseClipboard
また、キーエミュレートを利用しないで、自分のアプリ内で利用した文字列などをクリップボードにコピーする場合には、文字列をクリップボードに格納する分のメモリを確保する必要が出てくるため、利用し終えた後に、利用したメモリの開放やCloseClipboardで閉じるのを忘れてしまうと、メモリリークを起こしますので、本格的にクリップボードを操作する際は十分ご注意下さい。
→ テキストがコピー出来たかどうかの確認も出来る TextCopy
【ダウンロード】
◆IMEのオン/オフ◆
TextCopyではキー入力をエミュレートするという方法でクリップボードへのコピーを実現しているため、最初にIMEをオフし、最後にIMEをオンに戻す必要があります。
IMEのオン/オフを行うにはImmSetopenStatusを使います。
ImmSetOpenStatus(NULL, FALSE) // IMEオフ
ImmSetOpenStatus(NULL, TRUE) // IMEオン
→ MSDN Library:ImmSetOpenStatus
ATOKのオン/オフを行うには、さらにレジストリの書き換え、常駐監視も必要となってくるのですが、それはAtokChangerのソースを公開させていただいた時にご説明致します。
◆キー入力のエミュレート◆
先ほども書いたようにTextCopyではキー入力をエミュレートすることでクリップボードへのコピーを行っているのですが、それを実現する関数がkeybd_eventです。
例えば、
keybd_event(0x11, 0, 0, 0); // down
keybd_event(0x43, 0, 0, 0); // down
keybd_event(0x43, 0, KEYEVENTF_KEYUP, 0); // up
keybd_event(0x11, 0, KEYEVENTF_KEYUP, 0); // up
これでCTRLキーとCキーを押した状態、つまり「コピー」が出来ます。
→ MSDN Library:keybd_event
keybd_eventは第1引数にエミュレートしたいキーコード、第3引数にどの状態をエミュレートするかを指定します。
0x11は「CTRL」、0x43は「C」のキーコードを表しています。
各キーコードはこちらのページが参考になります。
こちらのページに書かれてあるのはWindowsの場合なので、WindowsMobileの場合と少し異なる部分もあります。
また、Gzhさんがキーコード調査用ツールを公開して下さっていますので、そちらで調べるのもいいと思います。(私もよく利用させてもらってます)
→ NICQUE Freeware:PQz_CHECK
キーの場合もマウスと同様に「押し込む→離す」で1動作となりますので、1回キーをエミュレートするためにはdownとupの2行必要になります。
keybd_event(0x11, 0, 0, 0); // down
keybd_event(0x11, 0, KEYEVENTF_KEYUP, 0); // up
今回の場合は「CTRL+C」キーのエミュレートをしているわけですが、その場合にどのような順番でキーコードが発行されているかをPQz_CHECKで見てみると、
(最初の0x11はCTRLキーを押した時のものなので、その次にCキーを押した時に表示されたものがCTRL+Cキーとして発行されたキーコードです)
という感じになるので、この通りにkeybd_eventでキーコードを発行させることにより、「CTRL+C」をエミュレートすることが出来ます。
◆クリップボードの操作◆
クリップボードを操作する前にはOpenClipboard、操作する前にはEmptyClipboardで中身を空にして、操作し終えたら必ずCloseClipboardでクリップボードを閉じて下さい。
今回はキーエミュレートでクリップボードに内容をコピーしているので、それ程神経質になることはありませんが、ちゃんとCloseClipboardをしないとシステムに不具合が生じる可能性はあると思います。
→ MSDN Library:OpenClipboard
→ MSDN Library:EmptyClipboard
→ MSDN Library:CloseClipboard
また、キーエミュレートを利用しないで、自分のアプリ内で利用した文字列などをクリップボードにコピーする場合には、文字列をクリップボードに格納する分のメモリを確保する必要が出てくるため、利用し終えた後に、利用したメモリの開放やCloseClipboardで閉じるのを忘れてしまうと、メモリリークを起こしますので、本格的にクリップボードを操作する際は十分ご注意下さい。