ClipboardSaveRestore.cpp 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. #include "stdafx.h"
  2. #include "CP_Main.h"
  3. #include ".\clipboardsaverestore.h"
  4. CClipboardSaveRestore::CClipboardSaveRestore(void)
  5. {
  6. }
  7. CClipboardSaveRestore::~CClipboardSaveRestore(void)
  8. {
  9. }
  10. bool CClipboardSaveRestore::Save()
  11. {
  12. m_Clipboard.RemoveAll();
  13. bool bRet = false;
  14. COleDataObjectEx oleData;
  15. CClipFormat cf;
  16. if(::OpenClipboard(theApp.m_MainhWnd))
  17. {
  18. int nFormat = EnumClipboardFormats(0);
  19. while(nFormat != 0)
  20. {
  21. HGLOBAL hGlobal = ::GetClipboardData(nFormat);
  22. LPVOID pvData = GlobalLock(hGlobal);
  23. if(pvData)
  24. {
  25. INT_PTR size = GlobalSize(hGlobal);
  26. if(size > 0)
  27. {
  28. //Copy the data locally
  29. cf.m_hgData = NewGlobalP(pvData, size);
  30. cf.m_cfType = nFormat;
  31. m_Clipboard.Add(cf);
  32. }
  33. GlobalUnlock(hGlobal);
  34. }
  35. nFormat = EnumClipboardFormats(nFormat);
  36. }
  37. ::CloseClipboard();
  38. bRet = true;
  39. }
  40. return bRet;
  41. }
  42. bool CClipboardSaveRestore::Restore()
  43. {
  44. bool bRet = false;
  45. if(::OpenClipboard(theApp.m_MainhWnd))
  46. {
  47. ::EmptyClipboard();
  48. SetClipboardData(theApp.m_cfIgnoreClipboard, NewGlobalP("Ignore", sizeof("Ignore")));
  49. INT_PTR size = m_Clipboard.GetSize();
  50. for(int nPos = 0; nPos < size; nPos++)
  51. {
  52. CClipFormat *pCF = &m_Clipboard.ElementAt(nPos);
  53. if(pCF && pCF->m_hgData)
  54. {
  55. ::SetClipboardData(pCF->m_cfType, pCF->m_hgData);
  56. pCF->m_hgData = NULL;//clipboard now owns the data
  57. }
  58. }
  59. bRet = TRUE;
  60. ::CloseClipboard();
  61. }
  62. m_Clipboard.RemoveAll();
  63. if(bRet == FALSE)
  64. {
  65. Log(_T("CClipboardSaveRestore::Restore failed to restore clipboard"));
  66. }
  67. return bRet;
  68. }
  69. bool CClipboardSaveRestore::RestoreTextOnly()
  70. {
  71. bool bRet = false;
  72. if(::OpenClipboard(theApp.m_MainhWnd))
  73. {
  74. ::EmptyClipboard();
  75. SetClipboardData(theApp.m_cfIgnoreClipboard, NewGlobalP("Ignore", sizeof("Ignore")));
  76. INT_PTR size = m_Clipboard.GetSize();
  77. for(int pos = 0; pos < size; pos++)
  78. {
  79. CClipFormat *pCF = &m_Clipboard.ElementAt(pos);
  80. if(pCF && pCF->m_hgData)
  81. {
  82. if(pCF->m_cfType == CF_TEXT || pCF->m_cfType == CF_UNICODETEXT)
  83. {
  84. //Make a copy of the data we are putting on the clipboard so we can still
  85. //restore all clips later in Restore()
  86. LPVOID localData = ::GlobalLock(pCF->m_hgData);
  87. HGLOBAL newData = NewGlobalP(localData, ::GlobalSize(pCF->m_hgData));
  88. ::SetClipboardData(pCF->m_cfType, newData);
  89. ::GlobalUnlock(pCF->m_hgData);
  90. }
  91. }
  92. }
  93. bRet = TRUE;
  94. ::CloseClipboard();
  95. }
  96. if(bRet == FALSE)
  97. {
  98. Log(_T("CClipboardSaveRestore::Restore failed to restore clipboard"));
  99. }
  100. return bRet;
  101. }