2011-07-17 14 views
5

से अधिक मैं चाहता हूँ अपने आवेदन विंडोज 7 में सूचना क्षेत्र में एक आइकन के लिए मैं Shell_NotifyIcon इस्तेमाल किया आइकन जोड़ने के लिए। आइकन प्रकट होता है, लेकिन जब मैं आइकन पर माउस पॉइंटर लाता हूं, तो आइकन गायब हो जाता है। आवेदन पूरे समय चल रहा है। आइकन छुपा नहीं है, यह अभी गायब हो जाता है।चिह्न अधिसूचना ट्रे माउस पर गायब हो जाता है करने के लिए जोड़ा

Shell_NotifyIcon एक गैर शून्य मान है, जो यह सफल होता है इसका मतलब है देता है।

static const int ID_TRAYICON = 300; 
static const int MSG_TRAYICON = WM_USER + 1; 
NOTIFYICONDATA nid; 
void InitTrayIconData() 
{ 
    memset(&nid, 0, sizeof(NOTIFYICONDATA)); 

    nid.cbSize = sizeof(NOTIFYICONDATA); 
    nid.hWnd = hwnd; 
    nid.uID = ID_TRAYICON; 
    nid.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP; 
    nid.uCallbackMessage = MSG_TRAYICON; 
    nid.hIcon = LoadIcon(nullptr, IDI_APPLICATION); 
    //nid.uVersion = NOTIFYICON_VERSION_4; 
    lstrcpy(nid.szTip, TEXT("Data Aggregator in-dev version")); 
} 

WM_CREATE संदेश को संसाधित करते समय तब:

InitTrayIconData(); 
Shell_NotifyIcon(NIM_ADD, &nid); 

और WM_DESTROY संसाधित करते समय:

Shell_NotifyIcon(NIM_DELETE, &nid); 

मैं भी कुछ के लिए देखा है कि

यहाँ प्रासंगिक कोड है कारण MSG_TRAYICON संदेश कभी नहीं कहा जाता है।

उत्तर

6

मैंने इसे समझ लिया। जब मैंने WM_CREATE में InitTrayIconData() को कॉल किया, तो वैश्विक hwnd को अभी तक CreateWindowEx से वापस दिया गया मान असाइन नहीं किया गया था (WM_CREATE संदेश CreateWindowEx कॉल के बाद नहीं भेजा गया था, लेकिन इसके दौरान, जिसे मैं नहीं जानता था)। तो लाइन,

nid.hWnd = hwnd; 

सिर्फ nid.hWnd nullptr के बराबर (जो है जो मैं hwnd के लिए शुरू किया था)।

मैंने WndProc में Hitnd तर्क को InitTrayIconData() में पास करके समस्या को ठीक किया, इसलिए यह वैश्विक hwnd के बजाय उस hwnd का उपयोग करेगा।

+1

मुझे एक ही समस्या थी, सही दिशा में मुझे इंगित करने के लिए धन्यवाद। – quantum

5

ऐसा तब होता है जब सिस्टम अधिसूचना आइकन के स्वामी के साथ संवाद नहीं कर सकता है।

आम तौर पर ऐसा इसलिए होता है क्योंकि प्रक्रिया असामान्य रूप से समाप्त हो गई है। आपके मामले में आप बताते हैं कि प्रक्रिया पूरे समय चल रही है। इस प्रकार मैं केवल यह निष्कर्ष निकाल सकता हूं कि अधिसूचना आइकन से जुड़े विंडो हैंडल को नष्ट कर दिया गया है, या संदेशों का सही ढंग से जवाब नहीं दे रहा है। यह निदान आपके अवलोकन के साथ भी लंबा है कि आपको MSG_TRAYICON प्राप्त नहीं होता है।

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