サンプル・プログラム

プログラムの解説: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($GlobalAlloc, array(0x0002, strlen($data) + 1));
0103: $pText = wb_call_function($GlobalLock, array($hText));
0104: wb_poke($pText, $data, strlen($data));
0105: wb_call_function($GlobalUnlock, array($hText));
0106: wb_call_function($OpenClipboard, array(NULL));
0107: wb_call_function($EmptyClipboard);
0108: wb_call_function($SetClipboardData, array($format, $pText));
0109: wb_call_function($CloseClipboard);
0110: wb_call_function($GlobalFree, array($hText));
0111: }

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

次に、呼び出す関数のアドレスを wb_get_function_address 関数を使って取得する。
必要な関数は次の通り。
- GlobalAlloc
- GlobalFree
- GlobalLock
- GlobalUnlock
- OpenClipboard
- EmptyClipboard
- SetClipboardData
- CloseClipboard

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: }
ファイル入力では組み込み関数 file_get_contents を使用しているので、ローカルドライブのファイルだけでなく、インターネット上のファイルも指定できる。
コンパイル
参考サイト
- クリップボード:WisdomSoft