PHPでクリップボードにテキスト貼り付け(Windowsアプリ版)

(1/1)
WinBinderbamcompile を使えば、Windows コンソールアプリをつくることもできる。今回は、クリップボードにテキストを貼り付けるプログラムを作ってみることにする。標準入力やパイプからの入力はもちろん、PHP の特長を活かし、ネット上のファイルをクリップすることもできる。

サンプル・プログラム

PHPでWindowsアプリ開発:クリップボードにテキスト貼り付け

プログラムの解説:Win32API

0047: /**
0048:  * クリップボードにデータをセット
0049:  * @param string $format データフォーマット(1:テキスト, 2:ビットマップ)
0050:  * @param string $data データ
0051:  * @return なし
0052: */
0053: function SetClipboardData($format$data) {
0054:     static $Kernel = NULL;
0055:     static $GlobalAlloc = NULL;
0056:     static $GlobalFree = NULL;
0057:     static $GlobalLock = NULL;
0058:     static $GlobalUnlock = NULL;
0059:     static $User = NULL;
0060:     static $OpenClipboard = NULL;
0061:     static $EmptyClipboard = NULL;
0062:     static $SetClipboardData = NULL;
0063:     static $CloseClipboard = NULL;
0064: 
0065:     if ($format == 1) {
0066:         if (INTERNAL_ENCODING != 'SJIS') {
0067:             $data = mb_convert_encoding($data, 'SJIS', INTERNAL_ENCODING);
0068:         }
0069:     }
0070: 
0071:     if ($Kernel == NULL) {
0072:         $Kernel = wb_load_library("Kernel");
0073:     }
0074:     if ($GlobalAlloc == NULL) {
0075:         $GlobalAlloc = wb_get_function_address("GlobalAlloc", $Kernel);
0076:     }
0077:     if ($GlobalFree == NULL) {
0078:         $GlobalFree = wb_get_function_address("GlobalFree", $Kernel);
0079:     }
0080:     if ($GlobalLock == NULL) {
0081:         $GlobalLock = wb_get_function_address("GlobalLock", $Kernel);
0082:     }
0083:     if ($GlobalUnlock == NULL) {
0084:         $GlobalUnlock = wb_get_function_address("GlobalUnlock", $Kernel);
0085:     }
0086:     if ($User == NULL) {
0087:         $User = wb_load_library("User");
0088:     }
0089:     if ($OpenClipboard == NULL) {
0090:         $OpenClipboard = wb_get_function_address("OpenClipboard", $User);
0091:     }
0092:     if ($EmptyClipboard == NULL) {
0093:         $EmptyClipboard = wb_get_function_address("EmptyClipboard", $User);
0094:     }
0095:     if ($SetClipboardData == NULL) {
0096:         $SetClipboardData = wb_get_function_address("SetClipboardData", $User);
0097:     }
0098:     if ($CloseClipboard == NULL) {
0099:         $CloseClipboard = wb_get_function_address("CloseClipboard", $User);
0100:     }
0101: 
0102:     $hText = wb_call_function($GlobalAllocarray(0x0002, strlen($data) + 1));
0103:     $pText = wb_call_function($GlobalLockarray($hText));
0104:     wb_poke($pText$datastrlen($data));
0105:     wb_call_function($GlobalUnlockarray($hText));
0106:     wb_call_function($OpenClipboardarray(NULL));
0107:     wb_call_function($EmptyClipboard);
0108:     wb_call_function($SetClipboardDataarray($format$pText));
0109:     wb_call_function($CloseClipboard);
0110:     wb_call_function($GlobalFreearray($hText));
0111: }

クリップボードにテキストを貼り付けるには、Win32API を利用する。処理の流れはクリップボード(WisdomSoft)を参考にした。

WinBinder には Win32API を呼び出す仕組みが用意されている。
まず、wb_load_library 関数を使い、ライブラリ DLL を読み込む。読み込むのは Kernel32.DLLUser32.DLL の 2種類だ。

次に、呼び出す関数のアドレスを wb_get_function_address 関数を使って取得する。
必要な関数は次の通り。


Win32API関数を呼び出すには、WinBinder 関数 wb_call_function を利用する。第1 引数は wb_get_function_address 関数で取得したアドレスで、第2 引数が関数へ渡すパラメタになる。第2 引数は配列で渡すことに注意が必要だ。

プログラムの解説:メインプログラム

0114: $str = '';
0115: if (isset($argv[1])) {
0116:     //ヘルプ
0117:     if ($argv[1] == '/?') {
0118:         help();
0119:     //ファイル入力
0120:     } else {
0121:         $str = file_get_contents($argv[1]);
0122:     }
0123: else {
0124:     //標準入力
0125:     $infp = fopen('php://stdin', 'r');
0126:     while (! feof($infp)) {
0127:         $str .= fgets($infp);
0128:     }
0129:     fclose($infp);
0130: }
0131: 
0132: //クリップボード貼り付け実行
0133: if ($str != '') {
0134:     SetClipboardData(1, $str);
0135: }

メインプログラムは、PHP プログラムに渡された引数 $argv を参照して、ヘルプ表示、ファイル入力、標準入力を場合分けしている。
ファイル入力では組み込み関数  file_get_contents  を使用しているので、ローカルドライブのファイルだけでなく、インターネット上のファイルも指定できる。

コンパイル

コマンドラインから "bamcompile clipp.bcp" を実行する。コンパイルが完了すると、"clipp.exe" が生成される。"clipp.exe" は、DLL 不要で、単独で動作する EXE プログラムである。

参考サイト

(この項おわり)
header