Windows 7任务栏状态,代码最少 [英] Windows 7 taskbar state with minimal code

查看:180
本文介绍了Windows 7任务栏状态,代码最少的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

为已知窗口句柄设置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任务栏状态,代码最少的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆