2013-02-21 29 views
9

将最短的代码设置为已知窗口句柄的Windows 7任务栏按钮的状态是什么?使用最小代码的Windows 7任务栏状态

目标是编写一个控制台实用程序,用于从批处理脚本更改控制台窗口任务栏项目的进度和状态(颜色)。脚本执行不同的任务时,其控制台窗口的任务栏项目应表示当前状态。

我得到了GetConsoleWindow()函数的窗口句柄,但它似乎需要大量的COM和Shell API的东西,我不明白。我发现的一个例子是使用MFC的整个GUI应用程序来演示API,但其中大部分对于我的小工具来说都太复杂了,而我不能很好地理解我去掉不需要的东西。

该工具应在Windows 7上使用VS2010(C++)进行编译,但也可以在较早的Windows版本上运行(如果某个功能不可用,则不执行任何操作)。

+0

你是什么意思的“任务栏状态”?你的意思是只显示进度或其他东西? – sashoalm 2013-02-21 12:52:15

+0

是的,只是进步和状态(不确定,暂停,错误,即颜色绿色,黄色和红色)。没有跳转列表,缩略图或动作按钮。 – ygoe 2013-02-21 13:14:46

回答

11

我创建了一个类来一次性设置项目的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; 
} 
+1

我想我需要这个:'#include '但是'VERIFY()'做了什么? – ygoe 2013-02-21 13:33:11

+1

没有什么重要的,我删除了编辑我的答案,并删除它。它就像一个ASSERT(),但该语句仍然在Release版本中执行。请参阅http://msdn.microsoft.com/en-us/library/fcatwy09(v=vs.80).aspx – sashoalm 2013-02-21 13:55:58

+4

我已经制作了一个方便的小工具,扩展了我以前的Flash-only功能。你可以在这里找到它:http://dev.unclassified.de/apps/flashconsolewindow – ygoe 2013-02-24 22:58:30

0

注意你仍然需要调用RegisterWindowMessage("TaskbarButtonCreated")ChangeWindowMessageFilterEx()设置一个消息过滤器之前SetProgressValue()可以工作。

根据MSDN文档,你应该重新创建你的对象,每次你得到创建的消息,但我发现我只需要做ChangeWindowMessageFilterEx(),它适用于正常情况。

+1

我已经写了一个应用程序,它使用'SetProgressValue'并且在没有'RegisterWindowMessage'和'ChangeWindowMessageFilterEx'的情况下完美地工作。与往常一样,文档中缺少大量信息。 – v77 2016-10-31 00:50:17