为已知窗口句柄设置Windows 7任务栏按钮的最短代码是什么?
目标是编写一个控制台实用程序,来自批处理脚本的控制台窗口任务栏项目的进度和状态(颜色)。当脚本执行不同的任务,其控制台窗口的任务栏项应该代表当前状态。
我得到的窗口句柄与GetConsoleWindow()函数,似乎需要加载COM和Shell API的东西,我不明白。我发现一个例子使用一个整个GUI应用程序与MFC来演示API,但大多数是太复杂的我的小工具,我不明白它足够删除我不需要的东西。 / p>
该工具应该在Windows 7上用VS2010(C ++)编译,但也可以在早期的Windows版本上运行(如果某个功能不可用,则不执行任何操作)。
解决方案我创建了一个类来一次为项目的Win7任务栏设置进度。这是我挖出的代码:
#include< shobjidl.h> #include< windows.h> #pragma comment(lib,Shell32.lib) #pragma comment(lib,Ole32.lib) 类Win7TaskbarProgress { public: Win7TaskbarProgress(); virtual〜Win7TaskbarProgress(); void SetProgressState(HWND hwnd,TBPFLAG标志); void SetProgressValue(HWND hwnd,ULONGLONG ullCompleted,ULONGLONG ullTotal); private: bool Init(); ITaskbarList3 * m_pITaskBarList3; bool m_bFailed; }; Win7TaskbarProgress :: Win7TaskbarProgress() { m_pITaskBarList3 = NULL; m_bFailed = false; } Win7TaskbarProgress ::〜Win7TaskbarProgress() { if(m_pITaskBarList3) { m_pITaskBarList3-& CoUninitialize(); } } void Win7TaskbarProgress :: SetProgressState(HWND hwnd,TBPFLAG flag) { if(Init()) m_pITaskBarList3 - > SetProgressState(hwnd,flag); } void Win7TaskbarProgress :: SetProgressValue(HWND hwnd,ULONGLONG ullCompleted,ULONGLONG ullTotal) { if(Init()) m_pITaskBarList3-> ; SetProgressValue(hwnd,ullCompleted,ullTotal); } bool Win7TaskbarProgress :: Init() { if(m_pITaskBarList3) return true; if(m_bFailed) return false; //为此线程初始化COM ... CoInitialize(NULL); CoCreateInstance(CLSID_TaskbarList,NULL,CLSCTX_INPROC_SERVER,IID_ITaskbarList3,(void **)& m_pITaskBarList3); if(m_pITaskBarList3) return true; m_bFailed = true; CoUninitialize(); return false; }
What would be the shortest code to set the state of a Windows 7 taskbar button for a known window handle?
The goal is to write a console utility that changes the progress and state (colour) of the console window taskbar item from a batch script. While the script performs different tasks, the taskbar item of its console window should represent the current state.
I get the window handle with the GetConsoleWindow() function, but then it seems to require loads of COM and Shell API stuff that I don't understand. One example I've found uses a whole GUI application with MFC to demonstrate the API, but most of it is way too complicated for my little tool and I don't understand it well enough to remove the stuff I don't need.
The tool should compile on Windows 7 with VS2010 (C++) but also run on earlier Windows versions (doing nothing if a feature is not available).
解决方案I created a class to set the progress in the Win7 taskbar for a project at one time. This is the code I dug up:
#include <shobjidl.h> #include <windows.h> #pragma comment(lib, "Shell32.lib") #pragma comment(lib, "Ole32.lib") class Win7TaskbarProgress { public: Win7TaskbarProgress(); virtual ~Win7TaskbarProgress(); void SetProgressState(HWND hwnd, TBPFLAG flag); void SetProgressValue(HWND hwnd, ULONGLONG ullCompleted, ULONGLONG ullTotal); private: bool Init(); ITaskbarList3* m_pITaskBarList3; bool m_bFailed; }; Win7TaskbarProgress::Win7TaskbarProgress() { m_pITaskBarList3 = NULL; m_bFailed = false; } Win7TaskbarProgress::~Win7TaskbarProgress() { if (m_pITaskBarList3) { m_pITaskBarList3->Release(); CoUninitialize(); } } void Win7TaskbarProgress::SetProgressState( HWND hwnd, TBPFLAG flag ) { if (Init()) m_pITaskBarList3->SetProgressState(hwnd, flag); } void Win7TaskbarProgress::SetProgressValue( HWND hwnd, ULONGLONG ullCompleted, ULONGLONG ullTotal ) { if (Init()) m_pITaskBarList3->SetProgressValue(hwnd, ullCompleted, ullTotal); } bool Win7TaskbarProgress::Init() { if (m_pITaskBarList3) return true; if (m_bFailed) return false; // Initialize COM for this thread... CoInitialize(NULL); CoCreateInstance(CLSID_TaskbarList, NULL, CLSCTX_INPROC_SERVER, IID_ITaskbarList3, (void **)&m_pITaskBarList3); if (m_pITaskBarList3) return true; m_bFailed = true; CoUninitialize(); return false; }
更多推荐
Windows 7任务栏状态,代码最少
发布评论