VC++如何获取并保存桌面背景?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了VC++如何获取并保存桌面背景?相关的知识,希望对你有一定的参考价值。

我想要获取整个桌面背景,要求不带软件快捷方式等图标,也不是要桌面壁纸路径。
假如用户用一张小图片做壁纸,且是以居中的方式显示在桌面,这样没被图片覆盖的桌面就用纯色来填充了,我想用vc获取这种样式的整个桌面背景并保存为图片。
请不要乱贴别人的代码,谢谢。

要实现的话,比较麻烦。

1)获取窗口句柄,桌面其实里面有一个LISTVIEW,因此要获取的窗口句柄不是DESKTOP,而是LISTVIEW

2)调用ClistView的GetBkImage或对应的WIN32 API函数获取LISTVIEW中LISTCTRL控件所具有的背景图片的详细信息(参见MSDN中关于LVBKIMAGE结构的说明)

3)由于桌面对应的CListCtrl控件不是我们自己程序中创建的控件,因此不能直接调用GetBkImage。因此比较麻烦的事情就在这里,需要下钩子,将自己的线程代码注入到CListCtrl所在的进程中,然后调用GetBkImage的WIN32 API函数获取背景图片的详细信息,最后反馈到自己进程中进行绘制,最终保存至BMP图片。

不知道楼主明白了没有,总之没什么基本功的话,该程序功能实现很困难。

换一个思路:
由于桌面在下次开机启动后能够被设置成上次关机前的状态。因此,桌面的信息肯定是被存在注册表中的。因此,如果通过读注册表来实现会容易很多。关键是壁纸对应的注册表键值需要楼主自己搜集了。
------------------------------------------
wawoo2007厉害,应该是个不错的办法。
HWND hwndPM = ::FindWindow(_T("ProgMan"), NULL);
参考技术A this->ShowWindow(SW_HIDE);
FindWindow(L"Shell_TrayWnd",NULL)->ShowWindow(SW_HIDE);
CWnd *pWndPrev;
pWndPrev=FindWindow(L"Progman",NULL);
if (pWndPrev)

pWndPrev->ShowWindow(SW_HIDE);
HDC myDC=::GetDC(0);
int x=GetSystemMetrics(SM_CXSCREEN);
int y=GetSystemMetrics(SM_CYSCREEN);
HDC hDCMemory = CreateCompatibleDC(myDC) ;
HBITMAP hBmp = CreateCompatibleBitmap(myDC, x, y) ;
HGDIOBJ hBmpPrev = SelectObject(hDCMemory, hBmp) ;
BitBlt(hDCMemory, 0, 0, x, y, myDC, 0, 0, SRCCOPY);
CImage image;
image.Attach(hBmp);
image.Save(L"c:\\1.bmp");
::ReleaseDC(0,myDC);
pWndPrev->ShowWindow(SW_SHOW);

this->ShowWindow(SW_SHOW);
FindWindow(L"Shell_TrayWnd",NULL)->ShowWindow(SW_SHOW);

放到函数体里面就行了。本回答被提问者采纳
参考技术B 1)找到 program manager 窗口,取句柄,ShowWindow 给它隐藏
2)截屏
3)恢复隐藏的窗口

VC 如何获取一个控件内的字体

我在对话框上放了一个RichText控件,在打开字体对话框的时候,能自动获取该控件的字体,并显示!我该如何做呢?

参考技术A 首先了解一下CHARFORMAT结构
SetDefaultCharFormat(
CHARFORMAT&
cf
);
typedef
struct
_charformat

UINT
cbSize;
_WPAD
_wPad1;
DWORD
dwMask;
DWORD
dwEffects;
LONG
yHeight;
LONG
yOffset;
COLORREF
crTextColor;
BYTE
bCharSet;
BYTE
bPitchAndFamily;
TCHAR
szFaceName[LF_FACESIZE];
_WPAD
_wPad2;

CHARFORMAT;
其中bCharSet有如下值
lfCharSet
Specifies
the
character
set.
The
following
values
are
predefined:
ANSI_CHARSET
BALTIC_CHARSET
CHINESEBIG5_CHARSET
DEFAULT_CHARSET
EASTEUROPE_CHARSET
GB2312_CHARSET
GREEK_CHARSET
HANGUL_CHARSET
MAC_CHARSET
OEM_CHARSET
RUSSIAN_CHARSET
SHIFTJIS_CHARSET
SYMBOL_CHARSET
TURKISH_CHARSET
Korean
Windows:
JOHAB_CHARSET
Middle-Eastern
Windows:
HEBREW_CHARSET
ARABIC_CHARSET
Thai
Windows:
THAI_CHARSET
OnChangeFont()
是对话框中一按钮消息响应函数
void
CTransformDlg::OnChangeFont()

//
TODO:
Add
your
control
notification
handler
code
here
CHARFORMAT
cf;
LOGFONT
lf;
memset(&cf,
0,
sizeof(CHARFORMAT));
memset(&lf,
0,
sizeof(LOGFONT));
//判断是否选择了内容
BOOL
m_bSelect
=
(m_RichEditCtrlTS.GetSelectionType()
!=
SEL_EMPTY)
?
TRUE
:
FALSE;
if
(m_bSelect)

m_RichEditCtrlTS.GetSelectionCharFormat(cf);

else

m_RichEditCtrlTS.GetDefaultCharFormat(cf);

//得到相关字体属性
BOOL
bIsBold
=
cf.dwEffects
&
CFE_BOLD;
BOOL
bIsItalic
=
cf.dwEffects
&
CFE_ITALIC;
BOOL
bIsUnderline
=
cf.dwEffects
&
CFE_UNDERLINE;
BOOL
bIsStrickout
=
cf.dwEffects
&
CFE_STRIKEOUT;
//设置属性
lf.lfCharSet
=
cf.bCharSet;
lf.lfHeight
=
cf.yHeight/15;
lf.lfPitchAndFamily
=
cf.bPitchAndFamily;
lf.lfItalic
=
bIsItalic;
lf.lfWeight
=
(bIsBold
?
FW_BOLD
:
FW_NORMAL);
lf.lfUnderline
=
bIsUnderline;
lf.lfStrikeOut
=
bIsStrickout;
sprintf(lf.lfFaceName,
cf.szFaceName);
//strcpy(lf.lfFaceName,
cf.szFaceName);
CFontDialog
dlg(&lf);
dlg.m_cf.rgbColors
=
cf.crTextColor;
if
(dlg.DoModal()
==
IDOK)

dlg.GetCharFormat(cf);
//获得所选的字体属性,如字体、颜色、大小等
if
(m_bSelect)
m_RichEditCtrlTS.SetSelectionCharFormat(cf);
//为选定的内容设定所选字体
else
m_RichEditCtrlTS.SetWordCharFormat(cf);
//为将要输入的内容设定字体//m_RichEditCtrlTS.SetDefaultCharFormat(cf);
//设置输入框内所有字符的字体,包括已经输入的和将要输入的字符

CFont
说明
CFont
font;
VERIFY(font.CreateFont(
12,
//
nHeight
0,
//
nWidth
0,
//
nEscapement
0,
//
nOrientation
FW_NORMAL,
//
nWeight
FALSE,
//
bItalic
FALSE,
//
bUnderline
0,
//
cStrikeOut
ANSI_CHARSET,
//
nCharSet
OUT_DEFAULT_PRECIS,
//
nOutPrecision
CLIP_DEFAULT_PRECIS,
//
nClipPrecision
DEFAULT_QUALITY,
//
nQuality
DEFAULT_PITCH
|
FF_SWISS,
//
nPitchAndFamily
"Arial"));
//
lpszFacename

以上是关于VC++如何获取并保存桌面背景?的主要内容,如果未能解决你的问题,请参考以下文章

获取bing图片并自动设置为电脑桌面背景(使用 URLDownloadToFile API函数)

怎么设置电脑桌面默认图片

找回误删除的UBUNTU16.04桌面壁纸图片,或把桌面背景图片另存。20161002

c ++在位图上绘制图像并保存

如何设计制作JavaWeb项目的自定义桌面实现,求源码?新手谢谢!

Windows7获取更换桌面背景,C#