2013-02-21 13 views
9

ज्ञात विंडो हैंडल के लिए विंडोज 7 टास्कबार बटन की स्थिति सेट करने के लिए सबसे छोटा कोड क्या होगा?विंडोज 7 टास्कबार राज्य न्यूनतम कोड

लक्ष्य एक कंसोल उपयोगिता लिखना है जो एक बैच स्क्रिप्ट से कंसोल विंडो टास्कबार आइटम की प्रगति और स्थिति (रंग) को बदलता है। जबकि स्क्रिप्ट विभिन्न कार्यों को निष्पादित करती है, इसकी कंसोल विंडो के टास्कबार आइटम को वर्तमान स्थिति का प्रतिनिधित्व करना चाहिए।

मुझे GetConsoleWindow() फ़ंक्शन के साथ विंडो हैंडल मिलता है, लेकिन फिर ऐसा लगता है कि COM और शैल एपीआई सामानों के लोड की आवश्यकता होती है जिन्हें मैं समझ नहीं पा रहा हूं। एक उदाहरण मैंने पाया है कि एपीआई का प्रदर्शन करने के लिए एमएफसी के साथ एक संपूर्ण जीयूआई एप्लीकेशन का उपयोग करता है, लेकिन इसमें से अधिकांश मेरे छोटे उपकरण के लिए बहुत जटिल है और मुझे यह समझ में नहीं आता कि मुझे जिस चीज की आवश्यकता नहीं है उसे हटाने के लिए पर्याप्त है।

उपकरण को विंडोज 7 पर वीएस -2010 (सी ++) के साथ संकलित करना चाहिए, लेकिन पहले विंडोज संस्करणों पर भी चलाना चाहिए (यदि सुविधा उपलब्ध नहीं है तो कुछ भी नहीं कर रहा है)।

+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

मुझे लगता है कि मुझे इसकी आवश्यकता है: '# शामिल करें ' लेकिन 'Verify() 'क्या करता है? – ygoe

+1

कुछ भी महत्वपूर्ण नहीं, मैंने अपना जवाब संपादित कर हटा दिया और इसे हटा दिया। यह एक एएसएसईआरटी() की तरह है लेकिन रिलीज बिल्ड में अभी भी कथन निष्पादित हो जाता है। Http://msdn.microsoft.com/en-us/library/fcatwy09(v=vs.80).aspx – sashoalm

+4

देखें मैंने अपनी पिछली फ्लैश-केवल सुविधा को विस्तारित करने में से एक आसान टूल बनाया है। आप इसे यहां पा सकते हैं: http://dev.unclassified.de/apps/flashconsolewindow – ygoe

0

नोट आप अभी भी पहले SetProgressValue() काम कर सकते हैं स्थापना के लिए RegisterWindowMessage("TaskbarButtonCreated") और ChangeWindowMessageFilterEx() कॉल करने के लिए एक संदेश फिल्टर की आवश्यकता: इस कोड मैं खोदा है।

एमएसडीएन दस्तावेज़ों के मुताबिक आपको हर बार जब आप निर्मित संदेश प्राप्त करते हैं तो आपको अपनी वस्तु को फिर से बनाना होगा, लेकिन मुझे पता चला कि मुझे केवल ChangeWindowMessageFilterEx() करना है और यह सामान्य परिस्थितियों के लिए ठीक काम करता है।

+1

मैंने एक एप्लीकेशन लिखा है जो 'SetProgressValue' का उपयोग करता है और' RegisterWindowMessage' के बिना पूरी तरह से काम करता है और न ही 'ChangeWindowMessageFilterEx'। हमेशा के रूप में, दस्तावेज़ीकरण में बहुत सारी सूचनाएं गायब हैं। – v77

संबंधित मुद्दे