summaryrefslogtreecommitdiff
path: root/FreeFileSync/Source/dll/Taskbar_Seven/taskbar.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'FreeFileSync/Source/dll/Taskbar_Seven/taskbar.cpp')
-rw-r--r--FreeFileSync/Source/dll/Taskbar_Seven/taskbar.cpp113
1 files changed, 113 insertions, 0 deletions
diff --git a/FreeFileSync/Source/dll/Taskbar_Seven/taskbar.cpp b/FreeFileSync/Source/dll/Taskbar_Seven/taskbar.cpp
new file mode 100644
index 00000000..72be7016
--- /dev/null
+++ b/FreeFileSync/Source/dll/Taskbar_Seven/taskbar.cpp
@@ -0,0 +1,113 @@
+// **************************************************************************
+// * This file is part of the FreeFileSync project. It is distributed under *
+// * GNU General Public License: http://www.gnu.org/licenses/gpl.html *
+// * Copyright (C) Zenju (zenju AT gmx DOT de) - All Rights Reserved *
+// **************************************************************************
+
+#include "taskbar.h"
+#include <map>
+#include <string>
+
+#define WIN32_LEAN_AND_MEAN
+#include <zen/com_error.h>
+#include <zen/com_ptr.h>
+
+#include <ShObjIdl.h>
+
+using namespace zen;
+
+
+namespace
+{
+std::wstring lastErrorMessage;
+
+
+ComPtr<ITaskbarList3> getInstance()
+{
+ ComPtr<ITaskbarList3> taskbarlist;
+
+ HRESULT hr = ::CoCreateInstance(CLSID_TaskbarList,
+ nullptr,
+ CLSCTX_ALL,
+ IID_PPV_ARGS(taskbarlist.init()));
+ if (FAILED(hr))
+ {
+ lastErrorMessage = formatComError(L"Error calling \"CoCreateInstance\".", hr);
+ return ComPtr<ITaskbarList3>();
+ }
+
+ return taskbarlist;
+}
+}
+//##################################################################################################
+
+
+bool tbseven::setStatus(void* hwnd, //HWND: window assciated to the taskbar icon
+ TaskBarStatus status)
+{
+ TBPFLAG flag = TBPF_NORMAL;
+ switch (status)
+ {
+ case STATUS_NOPROGRESS:
+ flag = TBPF_NOPROGRESS;
+ break;
+ case STATUS_INDETERMINATE:
+ flag = TBPF_INDETERMINATE;
+ break;
+ case STATUS_NORMAL:
+ flag = TBPF_NORMAL;
+ break;
+ case STATUS_ERROR:
+ flag = TBPF_ERROR;
+ break;
+ case STATUS_PAUSED:
+ flag = TBPF_PAUSED;
+ break;
+ }
+
+ ComPtr<ITaskbarList3> taskbarlist = getInstance();
+ if (!taskbarlist) //error msg already set
+ return false;
+
+ HRESULT hr = taskbarlist->SetProgressState(static_cast<HWND>(hwnd), //[in] HWND hwnd,
+ flag); //[in] TBPFLAG tbpFlags
+ if (FAILED(hr))
+ {
+ lastErrorMessage = formatComError(L"Error calling \"SetProgressState\".", hr);
+ return false;
+ }
+
+ return true;
+}
+
+
+bool tbseven::setProgress(void* hwnd, //HWND: window assciated to the taskbar icon
+ size_t current,
+ size_t total)
+{
+ ComPtr<ITaskbarList3> taskbarlist = getInstance();
+ if (!taskbarlist) //error msg already set
+ return false;
+
+ HRESULT hr = taskbarlist->SetProgressValue(
+ static_cast<HWND>(hwnd), //[in] HWND hwnd,
+ current, //[in] ULONGLONG ullCompleted,
+ total); //[in] ULONGLONG ullTotal
+ if (FAILED(hr))
+ {
+ lastErrorMessage = formatComError(L"Error calling \"SetProgressValue\".", hr);
+ return false;
+ }
+
+ return true;
+}
+
+
+void tbseven::getLastError(wchar_t* buffer, size_t bufferSize)
+{
+ if (bufferSize > 0)
+ {
+ size_t endPos = lastErrorMessage.copy(buffer, bufferSize - 1);
+ buffer[endPos] = 0;
+ }
+}
bgstack15