2013-02-21 5 views
9

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

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

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

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

+0

「タスクバーの状態」とはどういう意味ですか?進行状況などを表示しているだけですか? – sashoalm

+0

はい、進行状況と状態(不確定、一時停止、エラー、緑色、黄色、赤色)です。ジャムリスト、サムネイル、アクションボタンはありません。 – ygoe

答えて

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

+1

何も重要ではない、私は私の答えを編集削除し、それを削除しました。 ASSERT()のようですが、ステートメントはまだリリースビルドで実行されます。 http://msdn.microsoft.com/en-us/library/fcatwy09(v=vs.80).aspxを参照してください。 – sashoalm

+4

私は以前のFlash専用機能を拡張して、これから簡単なツールを作ってきました。ここで見つけることができます:http://dev.unclassified.de/apps/flashconsolewindow – ygoe

0

あなたはまだSetProgressValue()が動作する前に、メッセージフィルタのセットアップにRegisterWindowMessage("TaskbarButtonCreated")ChangeWindowMessageFilterEx()を呼び出す必要があります。

MSDNの文書によると、作成されたメッセージを取得するたびにオブジェクトを再作成するはずですが、私はちょうどChangeWindowMessageFilterEx()を実行しなければならないことがわかりました。

+1

私は 'SetProgressValue'を使うアプリケーションを書いており、' RegisterWindowMessage'や 'ChangeWindowMessageFilterEx'を使わずに完璧に動作します。いつものように、ドキュメントには多くの情報がありません。 – v77

関連する問題