在C中加载或保存位图句柄win32

在C中加载或保存位图句柄win32,c,winapi,clipboarddata,hbitmap,C,Winapi,Clipboarddata,Hbitmap,最后,我想将图像从剪贴板保存到img文件(.bmp,JPEG等)。这是一条漫长的路,所以我只想将图像加载到窗口中,但我似乎没有成功地使用GetClipboardData()。它总是返回NULL。搜索对我没有帮助。。 从剪贴板获取HBITMAP的代码: HWND hwnd = FindWindow("ConsoleWindowClass", NULL); if(!OpenClipboard(hwnd)) printf("Error opening clipboard\n"); HBITMAP hb

最后,我想将图像从剪贴板保存到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()进行格式化和其他操作,结果显示找不到文件。 睡眠是等待我按下打印屏幕,以确保剪贴板上有一些数据。

请参阅注释:

如果应用程序调用OpenClipboard时hwnd设置为NULL, EmptyClipboard将剪贴板所有者设置为空;这导致 将ClipboardData设置为失败


您是否验证了
FindWindow
没有返回null?如果这样做,
OpenClipboard
仍将成功,但
GetClipboardData
将失败。我敢打赌这正是发生的事情。

问题与
睡眠()和
清空主板()有关。

GetClipboardData()
失败,因为剪贴板为空。确切的错误是:“线程没有打开剪贴板”。
当使用
CF\u TEXT
时,这种情况不会发生,我认为这是因为字符串可以用null填充,但是
HBITMAP
除了位图内容的句柄之外,无法获取其他内容。

我过去习惯于
Sleep(3000)
以便有时间按print screen,但快照没有保存在剪贴板中,因为我在应用程序中打开了它。删除
EmptyClipboard()
解决了这个问题,因此在以编程方式打开快照之前,快照已经存在于剪贴板中。

现在尝试了,hwnd不是空的,这似乎不是问题。我还在代码开头添加了CloseClipboard,以防任何东西打开了剪贴板。结果是相同的,我想问题是你要求位图数据,但使用控制台窗口句柄。控制台窗口无法识别位图数据,只能识别文本。我会用记事本在剪贴板上放置一些文本来测试,而不是打印屏幕。使用CF_文本有效。这次我创建了一个窗口,在调用WM_CREATE时,将从剪贴板获取hbitmap的代码放在窗口过程中。GetClipboardData返回NULL,与前面一样。不过观察结果不错。很高兴能帮助您找到解决方案。:-)