gpt4 book ai didi

c++ - 我是否错误地使用了 Windows 剪贴板?

转载 作者:搜寻专家 更新时间:2023-10-31 00:02:33 25 4
gpt4 key购买 nike

我有一些代码要复制和粘贴:

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(基本上调用上面的复制和粘贴功能)时整个应用程序卡住。

我是否忘记检查某些内容或忘记释放资源?

最佳答案

我在您的 paste() 函数中看到两个问题:

1) 在将剪贴板数据分配给您的 std::wstring 变量之前调用 GlobalUnlock()。您需要反转这些操作 - 在复制数据之后调用 GlobalUnlock(),而不是之前。

2) 如果 GetClipboardData() 失败,它不会调用 CloseClipboard()

关于c++ - 我是否错误地使用了 Windows 剪贴板?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7843753/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com