13

Windows 7 のタスクバー ボタンの状態を既知のウィンドウ ハンドルに設定する最短のコードは何ですか?

目標は、バッチ スクリプトからコンソール ウィンドウのタスクバー項目の進行状況と状態 (色) を変更するコンソール ユーティリティを作成することです。スクリプトはさまざまなタスクを実行しますが、コンソール ウィンドウのタスクバー項目は現在の状態を表す必要があります。

GetConsoleWindow() 関数でウィンドウ ハンドルを取得しましたが、理解できない COM および Shell API の負荷が必要なようです。私が見つけた 1 つの例では、MFC を使用して GUI アプリケーション全体を使用して API を示していますが、そのほとんどは私の小さなツールには複雑すぎて、不要なものを削除するほどよく理解していません。

このツールは、VS2010 (C++) を使用する Windows 7 でコンパイルする必要がありますが、以前の Windows バージョンでも実行できます (機能が利用できない場合は何もしません)。

4

2 に答える 2

15

プロジェクトの Win7 タスクバーで一度に進行状況を設定するクラスを作成しました。ITaskBarList3これは、Windows シェルから利用できるインターフェイスのラッパーです。具体的にはITaskBarList3.SetProgressStateandITaskBarList3.SetProgressValue関数で行われます。

これは私が掘り起こしたコードです:

#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;
}
于 2013-02-21T13:04:46.463 に答える
0

機能する前に、メッセージフィルターを呼び出してセットアップするRegisterWindowMessage("TaskbarButtonCreated")必要があることに注意してください。ChangeWindowMessageFilterEx()SetProgressValue()

MSDNのドキュメントによると、作成されたメッセージを受け取るたびにオブジェクトを再作成することになっていますが、ChangeWindowMessageFilterEx()それを行うだけで通常の状況では問題なく動作することがわかりました。

于 2015-03-05T14:27:25.480 に答える