windows-nt/Source/XPSP1/NT/admin/activec/samples/dsplex/displex.cpp
2020-09-26 16:20:57 +08:00

151 lines
4.7 KiB
C++

//+-------------------------------------------------------------------------
//
// Microsoft Windows
//
// Copyright (C) Microsoft Corporation, 1999 - 1999
//
// File: DisplEx.cpp
//
//--------------------------------------------------------------------------
// DisplEx.cpp : Implementation of CDisplEx
#include "stdafx.h"
#include "dsplex.h"
#include "DisplEx.h"
// local proto
HRESULT Do (void);
/////////////////////////////////////////////////////////////////////////////
// CDisplEx
CDisplEx::CDisplEx()
{
}
CDisplEx::~CDisplEx()
{
}
//HRESULT CDisplEx::InitializeTaskPad (ITaskPad* pTaskPad)
//{
// return S_OK;
//}
HRESULT CDisplEx::TaskNotify (IDataObject * pdo, VARIANT * pvarg, VARIANT * pvparam)
{
if (pvarg->vt == VT_I4)
if (pvarg->lVal == 1)
return Do ();
::MessageBox (NULL, L"unrecognized task notification", L"Display Manager Extension", MB_OK);
return S_FALSE;
}
HRESULT CDisplEx::GetTitle (LPOLESTR szGroup, LPOLESTR * szTitle)
{
return E_NOTIMPL;
}
HRESULT CDisplEx::GetDescriptiveText(LPOLESTR szGroup, LPOLESTR * szText)
{
return E_NOTIMPL;
}
HRESULT CDisplEx::GetBackground(LPOLESTR szGroup, MMC_TASK_DISPLAY_OBJECT * pTDO)
{
return E_NOTIMPL;
}
HRESULT CDisplEx::EnumTasks (IDataObject * pdo, LPOLESTR szTaskGroup, IEnumTASK** ppEnumTASK)
{
CEnumTasks * pet = new CEnumTasks;
if(pet) {
pet->Init (pdo, szTaskGroup);
pet->AddRef ();
HRESULT hresult = pet->QueryInterface (IID_IEnumTASK, (void **)ppEnumTASK);
pet->Release ();
return hresult;
}
return E_OUTOFMEMORY;
}
HRESULT CDisplEx::GetListPadInfo (LPOLESTR szGroup, MMC_LISTPAD_INFO * pListPadInfo)
{
return E_NOTIMPL;
}
HRESULT Do (void)
{
HRESULT hresult = S_OK;
if (OpenClipboard (NULL) == 0)
hresult = S_FALSE;
else {
GLOBALHANDLE h = GetClipboardData (CF_DIB);
if (!h)
hresult = S_FALSE;
else {
BITMAPINFOHEADER * bih = (BITMAPINFOHEADER *)GlobalLock (h);
if (!bih)
hresult = E_OUTOFMEMORY;
else {
// validate bih
_ASSERT (bih->biSize == sizeof(BITMAPINFOHEADER));
// create a file in the windows directory called
// "DISPLEX.bmp"
OLECHAR path[MAX_PATH];
GetWindowsDirectory (path, MAX_PATH);
lstrcat (path, L"\\DISPLEX.bmp");
HANDLE hf = CreateFile (path,
GENERIC_WRITE, // access
0, // share mode
NULL, // security attributes
CREATE_ALWAYS, // creation
FILE_ATTRIBUTE_NORMAL,
NULL // template file
);
if (hf == (HANDLE)HFILE_ERROR)
hresult = E_FAIL;
else {
// BMP file header (14 bytes):
// 2 byte: "BM";
// long: size of file
// word: x hot spot
// word: y hot spot
// long: offset to bits
// DIB
BYTE bm[2];
bm[0] = 'B';
bm[1] = 'M';
DWORD dwWritten;
WriteFile (hf, (LPCVOID)bm, 2, &dwWritten, NULL);
DWORD dwTemp = 14 + GlobalSize (h);
WriteFile (hf, (LPCVOID)&dwTemp, sizeof(DWORD), &dwWritten, NULL);
dwTemp = 0; // both x, y hot spots in one shot
WriteFile (hf, (LPCVOID)&dwTemp, sizeof(DWORD), &dwWritten, NULL);
dwTemp = 14 + sizeof(BITMAPINFOHEADER);
dwTemp += bih->biClrUsed*sizeof(RGBQUAD);
WriteFile (hf, (LPCVOID)&dwTemp, sizeof(DWORD), &dwWritten, NULL);
// now write dib
WriteFile (hf, (LPCVOID)bih, GlobalSize (h), &dwTemp, NULL);
CloseHandle (hf);
if (GlobalSize(h) != dwTemp)
hresult = E_UNEXPECTED;
else {
// now make the BMP the wallpaper
SystemParametersInfo (SPI_SETDESKWALLPAPER,
0,
(void *)path,
SPIF_UPDATEINIFILE |
SPIF_SENDWININICHANGE
);
}
DeleteFile (path);
}
GlobalUnlock (h);
}
// don't free handle
}
CloseClipboard ();
}
if (hresult != S_OK)
::MessageBox (NULL, L"Either no Bitmap on Clipboard or\nout of Disk Space", L"Display Manager Extension", MB_OK);
return hresult;
}