
आइए C ++ में थोड़ी उपयोगिता एक साथ लिखें। हमारे कार्यक्रम को सिस्टम में कुछ की निगरानी करने दें और जब कुछ हुआ हो तो अधिसूचना क्षेत्र में एक आइकन दिखाएं। उदाहरण के लिए, जाँच एक फ़ाइल या मैप की गई ड्राइव के लिए होगी। कोई फ़ाइल नहीं है - केवल एक आइकन है, एक फ़ाइल दिखाई दी है - आइकन बदल गया है।
मेरे पास ऐसा आइकन है जो एन्क्रिप्टेड ड्राइव के कनेक्शन की निगरानी करता है। हो सकता है कि किसी को त्रुटियों के साथ एक प्रोटोकॉल फ़ाइल की उपस्थिति या नेटवर्क ड्राइव से कनेक्शन की उपस्थिति की निगरानी करने की आवश्यकता हो।
विकास के लिए, आप मुक्त दृश्य C ++ एक्सप्रेस संस्करण का उपयोग कर सकते हैं।
एक नया Win32 प्रोजेक्ट बनाने के लिए चुनें और प्रोजेक्ट का नाम "ट्रे" रखें। "अगला" बटन का उपयोग करते हुए, परियोजना सेटिंग्स पर जाएं और "खाली प्रोजेक्ट" बॉक्स की जांच करें।
चलिए एक अभिवादन के साथ शुरू करते हैं
प्रोजेक्ट में C ++ फ़ाइल (.cpp) जोड़ें और इसे "ट्रे" नाम दें। आइए ऐसे न्यूनतम कार्यक्रम से शुरू करें। इसके पाठ को दर्ज करने और चलाने का प्रयास करें।
#include <windows.h> #include <tchar.h> // int APIENTRY _tWinMain(HINSTANCE instance, HINSTANCE, LPTSTR, int) { MessageBox(0, TEXT(""), TEXT(""), 0); return 0; }
MessageBox () को कॉल करना एक ग्रीटिंग दिखाता है, और फिर प्रोग्राम समाप्त हो जाता है। यदि आप सफल होते हैं, तो आगे बढ़ें।
मुख्य खिड़की
हमें मूल रूप से एक विंडो की आवश्यकता नहीं है - मुख्य उपयोगकर्ता इंटरफ़ेस एक आइकन है। लेकिन एक आइकन बनाने और उसके संदेशों को संसाधित करने के लिए एक विंडो आवश्यक है।
एक विंडो बनाने के लिए, आपको संदेश प्रसंस्करण फ़ंक्शन WndProc () को परिभाषित करने की आवश्यकता है, WNDCLASSEX संरचना में विंडो क्लास को पंजीकृत करें, और वास्तव में CreateWindowEx () फ़ंक्शन के साथ विंडो बनाएं।
#include <windows.h> #include <tchar.h> // LRESULT CALLBACK WndProc(HWND window, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { // case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(window, message, wParam, lParam); } return 0; } // int APIENTRY _tWinMain(HINSTANCE instance, HINSTANCE, LPTSTR, int) { // WNDCLASSEX main = { 0 }; main.cbSize = sizeof(WNDCLASSEX); main.hInstance = instance; main.lpszClassName = TEXT("Main"); main.lpfnWndProc = WndProc; RegisterClassEx(&main); // HWND window = CreateWindowEx(0, TEXT("Main"), NULL, 0, 0, 0, 0, 0, NULL, NULL, instance, NULL); MessageBox(0, TEXT(""), TEXT(""), 0); return 0; }
मुख्य विंडो को कभी भी प्रदर्शित नहीं किया जाएगा, इसलिए सभी पैरामीटर न्यूनतम से भरे हुए हैं। कार्यक्रम को चलाने की कोशिश करें - इसके काम में कुछ भी नहीं बदला है।
चिह्न उत्पादन
आइकन का वास्तविक आउटपुट Shell_NotifyIcon () फ़ंक्शन द्वारा किया जाता है। उसे एक पैरामीटर के रूप में एक NOTIFYICONDATA संरचना की आवश्यकता होती है, और इस विंडो में हमारी विंडो का हैंडल होना चाहिए।
हम वैश्विक चर चिह्न में NOTIFYICONDATA संरचना को संग्रहीत करेंगे, क्योंकि यह अभी भी हमारे लिए उपयोगी है। हम स्वागत विंडो से पहले आइकन बनाएंगे, और कार्यक्रम से बाहर निकलने से पहले, इसे हटा दें।
#include <windows.h> #include <tchar.h> // NOTIFYICONDATA Icon = { 0 }; // // ... // int APIENTRY _tWinMain(HINSTANCE instance, HINSTANCE, LPTSTR, int) { // ... // ... // Icon.cbSize = sizeof(NOTIFYICONDATA); Icon.hWnd = window; Icon.uVersion = NOTIFYICON_VERSION; Icon.uCallbackMessage = WM_USER; Icon.hIcon = LoadIcon(NULL, IDI_SHIELD); Icon.uFlags = NIF_MESSAGE | NIF_ICON; Shell_NotifyIcon(NIM_ADD, &Icon); MessageBox(0, TEXT(""), TEXT(""), 0); // Shell_NotifyIcon(NIM_DELETE, &Icon); return 0; }
अब निष्पादन के लिए कार्यक्रम चलाएं। हमारा आइकन स्टार्टअप पर दिखाई देता है, और फिर संवाद बॉक्स में ओके पर क्लिक करने के बाद गायब हो जाता है। आइकन कैसा दिखता है यह hIcon पैरामीटर में निर्दिष्ट है। हम वहां मानक IDI_SHIELD आइकन लगाने के लिए LoadIcon () फ़ंक्शन का उपयोग करते हैं।
संदेश प्रसंस्करण चक्र
यह स्वागत योग्य संवाद को हटाने का समय है। जब आप कार्यक्रम शुरू करते हैं, तो हमारे पास केवल अधिसूचना क्षेत्र में एक आइकन होगा। आइकन पर राइट-क्लिक करके प्रोग्राम से बाहर निकलें। एक विंडो को कार्यक्रम के पूरा होने के बारे में पूछना चाहिए।
हम उस आइकन से संदेश प्रसंस्करण जोड़ेंगे जो माउस बटन संदेश प्रसंस्करण फ़ंक्शन पर क्लिक करता है। हम संदेश प्रसंस्करण लूप सम्मिलित करेंगे जहाँ ग्रीटिंग था।
...
शुरू करने के बाद, प्रोग्राम केवल आइकन दिखाता है, एक माउस क्लिक की प्रतीक्षा कर रहा है।
समय की जाँच
अब यह करना बाकी है जिसके लिए सब कुछ शुरू किया गया था। एक सेकंड के बाद, एक फ़ाइल जांच की जाएगी। यदि ऐसी फ़ाइल दिखाई देती है, तो आइकन बदलना चाहिए। टाइमर सेटटाइमर () फ़ंक्शन द्वारा सक्षम किया गया है, जिसके लिए मिलीसेकंड में समय अंतराल निर्दिष्ट किया जाना चाहिए।
किसी फ़ाइल के अस्तित्व की जाँच करने का कार्य विभिन्न तरीकों से लागू किया जा सकता है। यहाँ विशेषताएँ प्राप्त करने के माध्यम से सत्यापित करने का एक तरीका है।
/ bool FileExists(PTSTR path) { return GetFileAttributes(path) != INVALID_FILE_ATTRIBUTES; }
यदि GetFileAttributes () फ़ंक्शन दिए गए पथ में फ़ाइल विशेषताओं को नहीं पढ़ सकता है, तो फ़ाइल मौजूद नहीं है। पथ के रूप में, आप फ़ाइल के लिए पथ निर्दिष्ट कर सकते हैं, और फिर हम फ़ाइल के अस्तित्व की जांच करते हैं। और यदि आप डिस्क पर पथ सेट करते हैं, तो हम डिस्क की उपलब्धता की जांच करते हैं। मान लीजिए कि हम "P:" ड्राइव की उपस्थिति के लिए जाँच करेंगे।
हर बार आइकन को फिर से शुरू नहीं करने के लिए, वैश्विक चर में हम पिछली स्थिति को बचाएंगे, और हम Shell_NotifyIcon () को नई तस्वीर के साथ तभी कॉल करेंगे जब राज्य बदल गया हो। यहां कार्यक्रम का पूर्ण संस्करण है।
#include <windows.h> #include <tchar.h> // NOTIFYICONDATA Icon = { 0 }; // bool State = false; // // bool FileExists(PTSTR path) { return GetFileAttributes(path) != INVALID_FILE_ATTRIBUTES; } // LRESULT CALLBACK WndProc(HWND window, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { // case WM_TIMER: { bool check = FileExists(TEXT("P:\\")); if (State != check) { if (State) Icon.hIcon = LoadIcon(NULL, IDI_SHIELD); else Icon.hIcon = LoadIcon(NULL, IDI_WARNING); Icon.uFlags = NIF_ICON; Shell_NotifyIcon(NIM_MODIFY, &Icon); State = check; } break; } // case WM_USER: if (lParam == WM_RBUTTONDOWN) if (MessageBox(NULL, TEXT(" ?"), TEXT("Tray"), MB_YESNO) == IDYES) DestroyWindow(window); break; // case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(window, message, wParam, lParam); } return 0; } // int APIENTRY _tWinMain(HINSTANCE instance, HINSTANCE, LPTSTR, int) { // WNDCLASSEX main = { 0 }; main.cbSize = sizeof(WNDCLASSEX); main.hInstance = instance; main.lpszClassName = TEXT("Main"); main.lpfnWndProc = WndProc; RegisterClassEx(&main); // HWND window = CreateWindowEx(0, TEXT("Main"), NULL, 0, 0, 0, 0, 0, NULL, NULL, instance, NULL); // Icon.cbSize = sizeof(NOTIFYICONDATA); Icon.hWnd = window; Icon.uVersion = NOTIFYICON_VERSION; Icon.uCallbackMessage = WM_USER; Icon.hIcon = LoadIcon(NULL, IDI_SHIELD); Icon.uFlags = NIF_MESSAGE | NIF_ICON; Shell_NotifyIcon(NIM_ADD, &Icon); // SetTimer(window, 0, 1000, NULL); // MSG message; while (GetMessage(&message, NULL, 0, 0)) { TranslateMessage(&message); DispatchMessage(&message); } // Shell_NotifyIcon(NIM_DELETE, &Icon); return 0; }
रिलीज के विन्यास में, कार्यक्रम Tray.exe 8 केबी आकार में निकला।