2008年07月13日

【C++系】クリップボードに貼り付け

例のヤツに、クリップボードにホームページのタイトルとかURLを貼り付ける機能を付ける

・表示ページのタイトルをクリップボードに貼り付け
cb -t
cb title

・表示ページのURLをクリップボードに貼り付け
cb -u
cb url

んー、titleとかurlとか打たせるなら省略にだけハイフン付けるのも変か


ところで、クリップボードにワイドキャラのまま貼り付けたら、1文字目しかコピーできんかったのですが、そういうもんなんでしたっけ。イカン、クリップボードの仕様、全然知らん。

書いたソースは、こんな感じ。ワイドキャラでやった時は、sizeを2倍にして、そのままwstr.c_str()を渡した感じで書いて、イカンかった

==================================================
//貼り付ける文字をマルチバイト文字に変換
CW2A cw2a( wstr.c_str() );

//クリップボードを開く
if( !::OpenClipboard ( NULL ) )
  return;

//クリップボードへ文字列をコピー
HGLOBAL hMem = GlobalAlloc(GMEM_FIXED, wstr.size() + 1 );
LPSTR lpstr = (LPSTR)GlobalLock(hMem);
lstrcpyA ( lpstr, cw2a.m_psz );
GlobalUnlock(hMem);

//クリップボードに設定
EmptyClipboard();
SetClipboardData(CF_TEXT, hMem);
CloseClipboard();
==================================================

boost 1.35
VisualC++2008
posted by MW at 23:53| Comment(2) | TrackBack(0) | C++ | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
以下、参考にしていただけると、ありがたいです。

■クリップボード
以下のコードで、クリップボードへテキストをコピーします。
●ワイド文字の場合
一旦、WideCharToMultiByte関数を使ってマルチバイト文字(OEM)に変換する必要がある。
ワイド文字のままクリップボードにコピーしても、ペースト時に、マルチバイト文字扱いを受けるため、
ワイド文字の2バイト目が0x00だったら、終端文字扱いを受けてしまい、最初の1文字しか表示されない。
// convert wide chars into multi-byte chars
CByteArray baMultiString;
int nWideLength = strText.GetLength() + 1;
int nMultiLength = WideCharToMultiByte(CP_ACP, NULL, strText.GetBuffer(), nWideLength, NULL, NULL, NULL, NULL);
baMultiString.SetSize(nMultiLength);
WideCharToMultiByte(CP_ACP, NULL, strText.GetBuffer(), nWideLength, (char *)baMultiString.GetData(), nMultiLength, NULL, NULL);

// copy into clipboard
OpenClipboard();
EmptyClipboard();
HGLOBAL hGlob = GlobalAlloc(GMEM_FIXED, nMultiLength);
memcpy(hGlob, baMultiString.GetData(), nMultiLength);
::SetClipboardData(CF_TEXT, hGlob);
CloseClipboard();
Posted by woody at 2009年01月20日 20:47
おお、詳しいソースまで、ありがとうございます。勉強になりました。
Posted by MW at 2009年01月21日 00:47
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:


この記事へのトラックバック
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。