ygo*_*goe 11 c++ taskbar console-application windows-7
为已知窗口句柄设置Windows 7任务栏按钮状态的最短代码是什么?
目标是编写一个控制台实用程序,用于从批处理脚本更改控制台窗口任务栏项的进度和状态(颜色).当脚本执行不同的任务时,其控制台窗口的任务栏项应表示当前状态.
我使用GetConsoleWindow()函数获取窗口句柄,但是它似乎需要加载COM和Shell API的东西,我不明白.我发现的一个例子是使用一个完整的GUI应用程序和MFC来演示API,但是大多数它对于我的小工具来说太复杂了,而且我不太了解它以便删除我不需要的东西.
该工具应该在Windows 7上使用VS2010(C++)进行编译,但也可以在早期的Windows版本上运行(如果某个功能不可用则不执行任何操作).
sas*_*alm 13
我创建了一个类来同时为项目设置Win7任务栏中的进度.这是我挖出的代码:
#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;
}
Run Code Online (Sandbox Code Playgroud)