2013-02-21 28 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