Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

150 lines
4.7 KiB

  1. //+-------------------------------------------------------------------------
  2. //
  3. // Microsoft Windows
  4. //
  5. // Copyright (C) Microsoft Corporation, 1999 - 1999
  6. //
  7. // File: DisplEx.cpp
  8. //
  9. //--------------------------------------------------------------------------
  10. // DisplEx.cpp : Implementation of CDisplEx
  11. #include "stdafx.h"
  12. #include "dsplex.h"
  13. #include "DisplEx.h"
  14. // local proto
  15. HRESULT Do (void);
  16. /////////////////////////////////////////////////////////////////////////////
  17. // CDisplEx
  18. CDisplEx::CDisplEx()
  19. {
  20. }
  21. CDisplEx::~CDisplEx()
  22. {
  23. }
  24. //HRESULT CDisplEx::InitializeTaskPad (ITaskPad* pTaskPad)
  25. //{
  26. // return S_OK;
  27. //}
  28. HRESULT CDisplEx::TaskNotify (IDataObject * pdo, VARIANT * pvarg, VARIANT * pvparam)
  29. {
  30. if (pvarg->vt == VT_I4)
  31. if (pvarg->lVal == 1)
  32. return Do ();
  33. ::MessageBox (NULL, L"unrecognized task notification", L"Display Manager Extension", MB_OK);
  34. return S_FALSE;
  35. }
  36. HRESULT CDisplEx::GetTitle (LPOLESTR szGroup, LPOLESTR * szTitle)
  37. {
  38. return E_NOTIMPL;
  39. }
  40. HRESULT CDisplEx::GetDescriptiveText(LPOLESTR szGroup, LPOLESTR * szText)
  41. {
  42. return E_NOTIMPL;
  43. }
  44. HRESULT CDisplEx::GetBackground(LPOLESTR szGroup, MMC_TASK_DISPLAY_OBJECT * pTDO)
  45. {
  46. return E_NOTIMPL;
  47. }
  48. HRESULT CDisplEx::EnumTasks (IDataObject * pdo, LPOLESTR szTaskGroup, IEnumTASK** ppEnumTASK)
  49. {
  50. CEnumTasks * pet = new CEnumTasks;
  51. if(pet) {
  52. pet->Init (pdo, szTaskGroup);
  53. pet->AddRef ();
  54. HRESULT hresult = pet->QueryInterface (IID_IEnumTASK, (void **)ppEnumTASK);
  55. pet->Release ();
  56. return hresult;
  57. }
  58. return E_OUTOFMEMORY;
  59. }
  60. HRESULT CDisplEx::GetListPadInfo (LPOLESTR szGroup, MMC_LISTPAD_INFO * pListPadInfo)
  61. {
  62. return E_NOTIMPL;
  63. }
  64. HRESULT Do (void)
  65. {
  66. HRESULT hresult = S_OK;
  67. if (OpenClipboard (NULL) == 0)
  68. hresult = S_FALSE;
  69. else {
  70. GLOBALHANDLE h = GetClipboardData (CF_DIB);
  71. if (!h)
  72. hresult = S_FALSE;
  73. else {
  74. BITMAPINFOHEADER * bih = (BITMAPINFOHEADER *)GlobalLock (h);
  75. if (!bih)
  76. hresult = E_OUTOFMEMORY;
  77. else {
  78. // validate bih
  79. _ASSERT (bih->biSize == sizeof(BITMAPINFOHEADER));
  80. // create a file in the windows directory called
  81. // "DISPLEX.bmp"
  82. OLECHAR path[MAX_PATH];
  83. GetWindowsDirectory (path, MAX_PATH);
  84. lstrcat (path, L"\\DISPLEX.bmp");
  85. HANDLE hf = CreateFile (path,
  86. GENERIC_WRITE, // access
  87. 0, // share mode
  88. NULL, // security attributes
  89. CREATE_ALWAYS, // creation
  90. FILE_ATTRIBUTE_NORMAL,
  91. NULL // template file
  92. );
  93. if (hf == (HANDLE)HFILE_ERROR)
  94. hresult = E_FAIL;
  95. else {
  96. // BMP file header (14 bytes):
  97. // 2 byte: "BM";
  98. // long: size of file
  99. // word: x hot spot
  100. // word: y hot spot
  101. // long: offset to bits
  102. // DIB
  103. BYTE bm[2];
  104. bm[0] = 'B';
  105. bm[1] = 'M';
  106. DWORD dwWritten;
  107. WriteFile (hf, (LPCVOID)bm, 2, &dwWritten, NULL);
  108. DWORD dwTemp = 14 + GlobalSize (h);
  109. WriteFile (hf, (LPCVOID)&dwTemp, sizeof(DWORD), &dwWritten, NULL);
  110. dwTemp = 0; // both x, y hot spots in one shot
  111. WriteFile (hf, (LPCVOID)&dwTemp, sizeof(DWORD), &dwWritten, NULL);
  112. dwTemp = 14 + sizeof(BITMAPINFOHEADER);
  113. dwTemp += bih->biClrUsed*sizeof(RGBQUAD);
  114. WriteFile (hf, (LPCVOID)&dwTemp, sizeof(DWORD), &dwWritten, NULL);
  115. // now write dib
  116. WriteFile (hf, (LPCVOID)bih, GlobalSize (h), &dwTemp, NULL);
  117. CloseHandle (hf);
  118. if (GlobalSize(h) != dwTemp)
  119. hresult = E_UNEXPECTED;
  120. else {
  121. // now make the BMP the wallpaper
  122. SystemParametersInfo (SPI_SETDESKWALLPAPER,
  123. 0,
  124. (void *)path,
  125. SPIF_UPDATEINIFILE |
  126. SPIF_SENDWININICHANGE
  127. );
  128. }
  129. DeleteFile (path);
  130. }
  131. GlobalUnlock (h);
  132. }
  133. // don't free handle
  134. }
  135. CloseClipboard ();
  136. }
  137. if (hresult != S_OK)
  138. ::MessageBox (NULL, L"Either no Bitmap on Clipboard or\nout of Disk Space", L"Display Manager Extension", MB_OK);
  139. return hresult;
  140. }