2013-02-21 2 views
9

알려진 창 핸들에 대한 Windows 7 작업 표시 줄 단추의 상태를 설정하는 가장 짧은 코드는 무엇입니까?최소한의 코드로 Windows 7 작업 표시 줄 상태

목표는 배치 스크립트에서 콘솔 창 작업 표시 줄 항목의 진행 상태와 상태 (색상)를 변경하는 콘솔 유틸리티를 작성하는 것입니다. 스크립트가 다른 작업을 수행하는 동안 콘솔 창의 작업 표시 줄 항목이 현재 상태를 나타내야합니다.

GetConsoleWindow() 함수를 사용하여 창 핸들을 얻었지만 이해할 수없는 COM 및 Shell API로드가 필요할 것 같습니다. 내가 찾은 한 가지 예는 API를 보여주기 위해 MFC와 함께 전체 GUI 응용 프로그램을 사용하지만 대부분은 내 작은 도구로는 너무 복잡하고 필요하지 않은 것들을 제거 할만큼 충분히 이해하지 못합니다.

이 도구는 Windows 7에서 VS2010 (C++)으로 컴파일해야하지만 이전 Windows 버전에서도 실행해야합니다 (기능을 사용할 수없는 경우 아무 작업도 수행하지 않음).

+0

"작업 표시 줄 상태"란 무엇을 의미합니까? 진행 상황이나 다른 것을 표시한다는 것입니까? – sashoalm

+0

예, 진행 및 상태 (불확정, 일시 중지, 오류, 즉 녹색, 노란색 및 빨간색 색상). jumplists, 축소판 또는 작업 단추가 없습니다. – ygoe

답변

11

프로젝트의 Win7 작업 표시 줄에서 한 번에 진행률을 설정하는 클래스를 만들었습니다. 당신은 여전히 ​​SetProgressValue()이 작동하기 전에 설정에 메시지 필터를 RegisterWindowMessage("TaskbarButtonCreated")ChangeWindowMessageFilterEx()를 호출 할 필요가

#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

참고 :이 내가 발굴 코드입니다.

MSDN 문서에 따르면 만든 메시지를 가져올 때마다 개체를 다시 만들어야하지만 나는 단지 ChangeWindowMessageFilterEx()을 수행해야한다는 것을 알았습니다. 정상적인 상황에서는 정상적으로 작동합니다.

+1

'SetProgressValue'를 사용하고'RegisterWindowMessage' 나'ChangeWindowMessageFilterEx'없이 완벽하게 작동하는 어플리케이션을 작성했습니다. 언제나 그렇듯이 많은 정보가 설명서에 없습니다. – v77