ClipboardSaveRestore.cpp 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  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(BOOL textOnly)
  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. if(textOnly == false || (nFormat == CF_TEXT || nFormat == CF_UNICODETEXT))
  22. {
  23. HGLOBAL hGlobal = ::GetClipboardData(nFormat);
  24. LPVOID pvData = GlobalLock(hGlobal);
  25. if(pvData)
  26. {
  27. INT_PTR size = GlobalSize(hGlobal);
  28. if(size > 0)
  29. {
  30. //Copy the data locally
  31. cf.m_hgData = NewGlobalP(pvData, size);
  32. cf.m_cfType = nFormat;
  33. m_Clipboard.Add(cf);
  34. //m_Clipboard owns the data now
  35. cf.m_hgData = NULL;
  36. }
  37. GlobalUnlock(hGlobal);
  38. }
  39. }
  40. nFormat = EnumClipboardFormats(nFormat);
  41. }
  42. ::CloseClipboard();
  43. bRet = true;
  44. }
  45. return bRet;
  46. }
  47. bool CClipboardSaveRestore::Restore()
  48. {
  49. bool bRet = false;
  50. if(::OpenClipboard(theApp.m_MainhWnd))
  51. {
  52. ::EmptyClipboard();
  53. SetClipboardData(theApp.m_cfIgnoreClipboard, NewGlobalP("Ignore", sizeof("Ignore")));
  54. INT_PTR size = m_Clipboard.GetSize();
  55. for(int nPos = 0; nPos < size; nPos++)
  56. {
  57. CClipFormat *pCF = &m_Clipboard.ElementAt(nPos);
  58. if(pCF && pCF->m_hgData)
  59. {
  60. ::SetClipboardData(pCF->m_cfType, pCF->m_hgData);
  61. pCF->m_hgData = NULL;//clipboard now owns the data
  62. }
  63. }
  64. bRet = TRUE;
  65. ::CloseClipboard();
  66. }
  67. m_Clipboard.RemoveAll();
  68. if(bRet == FALSE)
  69. {
  70. Log(_T("CClipboardSaveRestore::Restore failed to restore clipboard"));
  71. }
  72. return bRet;
  73. }
  74. bool CClipboardSaveRestore::RestoreTextOnly()
  75. {
  76. bool bRet = false;
  77. if(::OpenClipboard(theApp.m_MainhWnd))
  78. {
  79. ::EmptyClipboard();
  80. SetClipboardData(theApp.m_cfIgnoreClipboard, NewGlobalP("Ignore", sizeof("Ignore")));
  81. INT_PTR size = m_Clipboard.GetSize();
  82. for(int pos = 0; pos < size; pos++)
  83. {
  84. CClipFormat *pCF = &m_Clipboard.ElementAt(pos);
  85. if(pCF && pCF->m_hgData)
  86. {
  87. if(pCF->m_cfType == CF_TEXT || pCF->m_cfType == CF_UNICODETEXT)
  88. {
  89. //Make a copy of the data we are putting on the clipboard so we can still
  90. //restore all clips later in Restore()
  91. LPVOID localData = ::GlobalLock(pCF->m_hgData);
  92. HGLOBAL newData = NewGlobalP(localData, ::GlobalSize(pCF->m_hgData));
  93. ::SetClipboardData(pCF->m_cfType, newData);
  94. ::GlobalUnlock(pCF->m_hgData);
  95. }
  96. }
  97. }
  98. bRet = TRUE;
  99. ::CloseClipboard();
  100. }
  101. if(bRet == FALSE)
  102. {
  103. Log(_T("CClipboardSaveRestore::Restore failed to restore clipboard"));
  104. }
  105. return bRet;
  106. }