どこだ?

「どこだ! 」と記者会見場、ウトウトまなこでつぶやいたのは、どこぞの国の大臣ですが・・・(^^;、横にいた人とか側近の人たちは当然異常は気づいていたはずで・・・他人のことは放っておいて自分だけみたいな「人のことは放っておけ」という日本の今の無責任な風情を現しているように感じます。

先日、会社の会長が事務所に来て「なかがわ君はどこだ?、Photoshop(Elementsのことらしい)で写真をプリントする仕方を教えてくれないか」と言ったかどうかは覚えてないが、今度教えに行くことになりました。会長、確か・・・D300使ってたよなぁ・・・、と思いつつ、なんかこういうAdobe関連のソフトのことは、あいつにに聞け、ということになっているらしい・・・おいおい(–; 本社で客のHP作っているグループがいるのに。。。おそらく・・・「仕事しないで暇なんだから、あいつにふれ」みたいな感じになっているんだろう(笑)

それはさておき・・・。目から鱗が落ちつつ、自分の無知さ加減を知ったことが今日もまた一つ。

最近文字列処理のエンコードを従来のANSIマルチバイトから、UNICODEに切り替えつつあります。いまさらながら・・・WindowsではやっぱりUNICODE使うのが正統だし、ホームページやWebアプリも日本語文字の表現にEUCやShiftJISよりUNICODEを使うのがほぼ主流みたいです。で、そういうUNICODEなプログラムを組む前にコンソール(CMD.EXE)に出力するタイプのテストコードを書いて動作を確かめるんですが、UNICODE文字をそのままC言語ならprintf()関数とかでコンソールに出力しても、当然ですが文字化けです。

で、printf関数の前に、

setlocale(LC_ALL,"jpn");

とすると・・・おお! 文字化けしねぇ~(^^;;; とまるでC言語おぼえたての頃に戻ったような情けない気持ちになります。

でも・・・UTF8ならコンソールでコードページを65001にすれば(chcp 65001)表示されるはずなんだけど、どういうわけかフォントがMSゴシックにどうやっても切り替えられないんすよねぇ・・・。そういう仕様なのか、そういう風に変更になったのか・・・よくわかんないや。

寒すぎですねぇ

数年前なら平気で撮影会とか行ってましたが(笑)

原点回帰して、C++とWin32APIで組むのが最近はまりつつあります。まぁ、当たり前ですけど、同じ機能のものをC#やPerlとPerlモジュール、WSHで組めば圧倒的に早くバグがない安全なものが完成するんですけど、家で使うツールぐらいはねぇ・・・少々バグがあっても無問題だし・・・ってことで、ほとんど忘れかけていたC++を持ち出して夜遅くまでエディタとデバッガと睨めっこです。

昨日から書き始めたのが、

  • クリップボードの内容(CF_TEXT)をファイルに書き出す。
  • テキストファイルの内容をクリップボードに転送する。

ただ、これだけ。非常に簡単。

何に使うのかというと・・・、ブラウザなどでテキストをコピーしてどっかに保存するとき・・・

  1. デスクトップを右クリック→新規作成→テキストドキュメント でファイル作成
  2. 作成したファイルをエディタで開いてペースト(貼り付け)
  3. 保存する。

という、一連のステップが非常にメンドクサイ(^^;; ただ、一回だけなら・・・別に良いんだけど・・・。

というわけで・・・レジストリを弄って「デスクトップを右クリック→新規作成」のメニューに「クリップボード」項目を作成。これが選択されたら、もしクリップボードにテキスト形式(CF_TEXT)のデータがあれば、新規にファイルを作成してそこにペースト&保存するようにした。

e5908de7a7b0e69caae8a8ade5ae9a-1

プログラム的には、一個関数を作ればいい程度のものですが、再利用したいので強引にC++風にする。

class CClipboardText
{
  //コピーコンストラクタと代入演算子は使用禁止
  CClipboardText(const CClipboardText& rhs);
  CClipboardTexT& operator=(const CClipboardText& rhs);

protected:
  LPBYTE lpData; //内部データのためのバッファ
  size_t cbLen; //バッファのサイズ

public:
  //コンストラクタとデストラクタ
  CClipboardText();
  virtual ~CClipboardText();

  //公開メソッド
  virtual bool Save(LPTSTR lpOut);
  virtual bool Load(LPTSTR lpIn);
};

要は、コンストラクタで Win32 APIのOpenClipboard()とGetClipboardData()を呼んで内部データバッファにデータを読み出し、Saveメソッドでファイルに書き出す。デストラクタで内部データバッファの解放とWin32APIのCloseClipboard()をコールするだけ。
あとは、適当なタイミングでインスタンスを作成して、save()すればいい。

//クリップボードのテキストデータをファイルに書き出す。
//使い捨て?のオブジェクトなので変数を用意せず、無名のまま使用(^^;
CClipboardText().Save(TEXT("ファイル名"));

要は、コンストラクタで Win32 APIのOpenClipboard()とGetClipboardData()を呼んで内部データバッファにデータを読み出し、Saveメソッドでファイルに書き出す。デストラクタで内部データバッファの解放とWin32APIのCloseClipboard()をコールするだけ。
あとは、適当なタイミングでインスタンスを作成して、save()すればいい。

//クリップボードのテキストデータをファイルに書き出す。
//使い捨て?のオブジェクトなので変数を用意せず、無名のまま使用(^^;
CClipboardText().Save(TEXT("ファイル名"));

まだLoadメソッドが未実装。今日中に完成して連休は終わりです(^^;;;

追記)
・・・と、思ったけど、ContextmenuHandlerにしてシェルエクステンションで実装する方が、よりスマートで、いいかもしれない。でもVistaだとエクスプローラ・シェルがさらに重くなりそうな悪寒が・・・。