2013-02-21 12 views
9

Jaki byłby najkrótszy kod do ustawienia stanu przycisku paska zadań systemu Windows 7 dla znanego uchwytu okna?Stan paska zadań Windows 7 z minimalnym kodem

Celem jest napisanie narzędzia konsoli, które zmienia postęp i stan (kolor) elementu paska zadań okna konsoli ze skryptu wsadowego. Podczas gdy skrypt wykonuje różne zadania, element paska zadań w jego oknie konsoli powinien reprezentować bieżący stan.

Dostaję uchwyt okna z funkcją GetConsoleWindow(), ale wydaje się, że wymaga ona mnóstwa rzeczy COM i Shell API, których nie rozumiem. Jeden z przykładów, który znalazłem, wykorzystuje całą aplikację GUI z MFC do zademonstrowania API, ale większość jest zbyt skomplikowana dla mojego małego narzędzia i nie rozumiem go wystarczająco dobrze, aby usunąć rzeczy, których nie potrzebuję.

Narzędzie powinno się kompilować w systemie Windows 7 z VS2010 (C++), ale także działać w starszych wersjach systemu Windows (nie wykonując żadnych czynności, jeśli funkcja nie jest dostępna).

+0

Co masz na myśli przez "stan paska zadań"? Masz na myśli tylko wyświetlanie postępu lub coś innego? – sashoalm

+0

Tak, tylko postęp i stan (nieokreślony, wstrzymany, błąd, tj. Kolory zielony, żółty i czerwony). Brak list odtwarzania, miniatur ani przycisków akcji. – ygoe

Odpowiedz

11

Utworzono klasę, aby ustawić postępy na pasku zadań Win7 dla projektu w tym samym czasie. Jest to kod I wykopali:

#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

Myślę, że potrzebuję tego: '#include ' Ale co robi 'VERIFY()'? – ygoe

+1

Nic ważnego, usunąłem, edytowałem moją odpowiedź i usunąłem ją. To jest jak ASSERT(), ale instrukcja nadal jest wykonywana w wersjach Release. Zobacz http://msdn.microsoft.com/en-us/library/fcatwy09(v=vs.80).aspx – sashoalm

+4

Zrobiłem poręczne małe narzędzie z tego, rozszerzając moją poprzednią funkcję tylko Flash. Można go znaleźć tutaj: http://dev.unclassified.de/apps/flashconsolewindow – ygoe

0

Uwaga trzeba jeszcze zadzwonić RegisterWindowMessage("TaskbarButtonCreated") i ChangeWindowMessageFilterEx() do konfiguracji filtru wiadomości przed SetProgressValue() może pracować.

Zgodnie z dokumentami MSDN, powinieneś odtworzyć swój obiekt za każdym razem, gdy otrzymasz utworzoną wiadomość, ale znalazłem, że po prostu musiałem zrobić ChangeWindowMessageFilterEx() i działa dobrze w normalnych okolicznościach.

+1

Napisałem aplikację, która używa 'SetProgressValue' i działa doskonale bez' RegisterWindowMessage' ani 'ChangeWindowMessageFilterEx'. Jak zawsze w dokumentacji brakuje wielu informacji. – v77

Powiązane problemy