私はコピー&ペーストするにはいくつかのコードを持っている:私は間違ってWindowsのクリップボードを使用していますか?
void WinClipboard::copy(const std::string& input)
{
LPWSTR lptstrCopy;
HGLOBAL hglbCopy;
std::wstring text;
text = _winUTF8ToUTF16(input);
// Open the clipboard, and empty it.
if (!OpenClipboard(NULL))
return;
EmptyClipboard();
// Allocate a global memory object for the text.
hglbCopy = GlobalAlloc(GMEM_MOVEABLE,
((text.length() + 1) * sizeof(WCHAR)));
if (hglbCopy == NULL)
{
CloseClipboard();
return;
}
// Lock the handle and copy the text to the buffer.
lptstrCopy = (LPWSTR)GlobalLock(hglbCopy);
memcpy(lptstrCopy, text.c_str(),
(text.length() + 1) * sizeof(WCHAR));
lptstrCopy[(text.length() + 1) * sizeof(WCHAR)] = (WCHAR) 0; // null character
GlobalUnlock(hglbCopy);
// Place the handle on the clipboard.
SetClipboardData(CF_UNICODETEXT, hglbCopy);
// Close the clipboard.
CloseClipboard();
}
std::string WinClipboard::paste()
{
HGLOBAL hglb;
LPWSTR lptstr;
std::string result;
std::wstring input;
// get the clipboard text.
if (!IsClipboardFormatAvailable(CF_UNICODETEXT))
return result;
if (!OpenClipboard(NULL))
return result;
hglb = GetClipboardData(CF_UNICODETEXT);
if (hglb != NULL)
{
lptstr = (LPWSTR)GlobalLock(hglb);
if (lptstr != NULL)
{
GlobalUnlock(hglb);
input = lptstr;
result = _winUTF16ToUTF8(input);
}
CloseClipboard();
}
return result;
}
私はすぐにCTRL Cその後、CTRL-V(基本的に上記のコピー&ペースト機能を呼び出すに)アプリケーション全体がフリーズを行うときには、除いて素晴らしい作品。
は、私が何かを確認するために忘れたり、リソースを解放するために忘れているだろうか?
ライン 'lptstrCopy [(text.length()+ 1)*はsizeof(WCHAR)]'バッファオーバーフローです。 –
@RaymondChenこのコードを使ってみましたが、 'SetClipboardData()'の呼び出し中にクラッシュしました。明示的にヌル文字を設定しようとしている別の例は見たことがありません。 –
MSDNの状態:...クリップボードを開くときにアプリケーションがNULLウィンドウハンドルを指定すると、EmptyClipboardは成功しますが、クリップボードの所有者はNULLに設定されます。これにより、SetClipboardDataが失敗することに注意してください。 – Orwellophile