【问题标题】:load or save bitmap handle win32 in C在 C 中加载或保存位图句柄 win32
【发布时间】:2013-03-23 18:59:05
【问题描述】:

最终,我想将剪贴板中的图像保存到 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() 格式化和所有内容,它说找不到文件。 睡眠是等我按打印屏幕,以确保剪贴板有一些数据。

【问题讨论】:

    标签: c winapi clipboarddata hbitmap


    【解决方案1】:

    见cmetshere:

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

    您是否确认FindWindow 没有返回空值?如果是这样,OpenClipboard 仍然会成功,但GetClipboardData 会失败。我敢打赌,这正是正在发生的事情。

    【讨论】:

    • 现在试了一下,hwnd不是NULL,好像不是问题。
    • 我还在代码的开头添加了 CloseClipboard,以防剪贴板打开。结果是一样的
    • 那么我预计问题是您要求位图数据但使用控制台窗口句柄。控制台窗口不能识别位图数据,只能识别文本。我会使用记事本在剪贴板上放置一些文本来测试,而不是打印屏幕。
    • 使用 CF_TEXT 有效。这次我创建了一个窗口,当调用 WM_CREATE 时,将代码从剪贴板中获取 hbitmap 放在窗口过程中。 GetClipboardData 和以前一样返回 NULL。不错的观察结果。
    • 很高兴帮助找到解决方案。 :-)
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2011-03-09
      • 1970-01-01
      • 2015-08-07
      • 2011-09-01
      • 1970-01-01
      • 2023-04-09
      • 1970-01-01
      • 2013-09-13
      • 1970-01-01
      相关资源
      最近更新 更多