0

最终,我想将剪贴板中的图像保存到 img 文件(.bmp、JPEG 等)。那是一条漫长的道路,所以我只想将图像加载到窗口中,但 GetClipboardData() 似乎没有任何成功。它总是返回 NULL。搜索对我没有帮助..从剪贴板获取 HBITMAP 的代码:

HWND hwnd = FindWindow("ConsoleWindowClass", NULL);
if(!OpenClipboard(hwnd)) printf("Error opening clipboard\n");
HBITMAP hbmp;
EmptyClipboard();
Sleep(3000);
if((hbmp = (HBITMAP)GetClipboardData(CF_BITMAP)) == NULL) printf("Error geting clipboard data\n");

输出:获取剪贴板数据时出错

我尝试使用 GetLastError() 格式化和所有内容,它说找不到文件。睡眠是等待我按打印屏幕,以确保剪贴板有一些数据。

4

2 回答 2

1

请参阅此处的评论:

如果应用程序在 hwnd 设置为 NULL 的情况下调用 OpenClipboard,EmptyClipboard 会将剪贴板所有者设置为 NULL;这会导致 SetClipboardData 失败。

您是否已验证FindWindow不返回 null?如果是这样,OpenClipboard仍然会成功,但GetClipboardData会失败。我敢打赌,这正是正在发生的事情。

于 2013-03-23T19:33:11.423 回答
1

问题与Sleep()EmptyClipboard()
GetClipboardData()剪贴板为空有关并且失败。确切的错误是:“线程没有打开剪贴板”。
使用时CF_TEXT不会发生这种情况,我认为是因为字符串可以用 null 填充,但是HBITMAP除了位图内容的句柄之外,a 无法获取其他内容。
我曾经Sleep(3000)为了有时间按打印屏幕,但快照没有保存在剪贴板中,因为我在我的应用程序中打开了它。删除EmptyClipboard()解决了这个问题,因此在以编程方式打开它之前获取剪贴板中已经存在的快照。

于 2013-03-24T16:11:44.527 回答