|
|
//+-------------------------------------------------------------------------
//
// 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; }
|