दिलचस्प पोस्ट
ठीक से jQuery के साथ HTTP हेडर स्वीकार नहीं किया जा सकता है क्या टी-एसक्यूएल स्ट्रिंग को जोड़ना एक समग्र कार्य है? यह क्यों नहीं: सीएसएस शैली काम का दौरा किया? एएसपी.नेट एमवीसी: डेटाएनेटेशन द्वारा कस्टम वैल्यूशन कोई उपयोगकर्ता एंड्रॉइड डिवाइस पर हेडसेट कैसे प्लग करता है, यह कैसे पता लगा सकता है? (ACTION_AUDIO_BECOMING_NOISY के विपरीत) 'वास्तविक', 'उपयोगकर्ता' और 'सिस' का मतलब समय (1) के उत्पादन में क्या होता है? Data.frame विधि के लिए सबसे कुशल सूची? आईई 7 में getElementsByName आप एक फ़ॉन्ट कैसे आयात करते हैं? UIScrollView। "अनंत" स्क्रॉल / ज़ूम को लागू करने पर कोई विचार? Async-await on .net 4 का उपयोग करना आर में क्लस्टर विश्लेषण: समूहों की इष्टतम संख्या निर्धारित करें आर मार्कडाउन को HTML में कन्वर्ट करने के लिए कैसे? Ie, "बुना एचटीएमएल" क्या रस्टूडियो 0.96 में करता है? सरल एक्सएमएल फ़ाइल से डेटा का निष्कर्षण जीआईटी में निर्दिष्ट प्रतिबद्धता को कैसे संशोधित करें?

कैसे मुख्य आईडीसी प्रक्रिया आईडी से संभाल पाने के लिए?

कैसे मुख्य आईडीसी प्रक्रिया आईडी से संभाल पाने के लिए?

मैं इस विंडो को मोर्चे पर लाना चाहता हूं।

यह "प्रक्रिया एक्सप्लोरर" में अच्छी तरह से काम करता है

वेब के समाधान से एकत्रित समाधान "कैसे मुख्य आईडीसी प्रक्रिया आईडी से संभाल पाने के लिए?"

मैंने चेक किया कि .NET कैसे मुख्य विंडो को निर्धारित करता है।

मेरी खोज से पता चला है कि यह भी EnumWindows() का उपयोग करता है

इस कोड को ऐसा ही करना चाहिए। नेट तरीके से:

 struct handle_data { unsigned long process_id; HWND best_handle; }; HWND find_main_window(unsigned long process_id) { handle_data data; data.process_id = process_id; data.best_handle = 0; EnumWindows(enum_windows_callback, (LPARAM)&data); return data.best_handle; } BOOL CALLBACK enum_windows_callback(HWND handle, LPARAM lParam) { handle_data& data = *(handle_data*)lParam; unsigned long process_id = 0; GetWindowThreadProcessId(handle, &process_id); if (data.process_id != process_id || !is_main_window(handle)) { return TRUE; } data.best_handle = handle; return FALSE; } BOOL is_main_window(HWND handle) { return GetWindow(handle, GW_OWNER) == (HWND)0 && IsWindowVisible(handle); } 

मुझे विश्वास नहीं होता कि विंडोज (.नेट के विपरीत) इसे प्राप्त करने का एक सीधा तरीका प्रदान करता है।

मुझे पता है कि एकमात्र तरीका है EnumWindows() साथ सभी शीर्ष स्तर की खिड़कियां गणना करना और उसके बाद प्रत्येक प्रक्रिया GetWindowThreadProcessID() । यह अप्रत्यक्ष और अक्षम लगता है, लेकिन यह उतना खराब नहीं है जितना आप उम्मीद कर सकते हैं – एक विशिष्ट मामले में, आपके पास चलने के लिए एक दर्जन से अधिक शीर्ष स्तर की खिड़कियां हो सकती हैं …

यहाँ एक गलत-समझ की संभावना है WinForms फ्रेमवर्क में। नेट स्वचालित रूप से बनाई गई पहली विंडो को निर्दिष्ट करती है (उदाहरण के लिए, Application.Run(new SomeForm()) ) Application.Run(new SomeForm()) विंडो के रूप में। हालांकि, Win32 एपीआई प्रति प्रक्रिया "मुख्य विंडो" के विचार को नहीं पहचानती है। संदेश लूप सिस्टम और प्रोसेस संसाधनों के रूप में कई "मुख्य" खिड़कियों को संभालने में पूरी तरह सक्षम है I इसलिए, आपकी प्रक्रिया में "मुख्य विंडो" नहीं है सबसे अच्छा आप सामान्य मामले में कर सकते हैं EnumWindows() का उपयोग किसी भी प्रक्रिया में सक्रिय सभी गैर-बाल खिड़कियों को प्राप्त करने के लिए और कुछ उत्थानों का उपयोग करने के लिए यह पता लगाने की कोशिश करें कि कौन सा आप चाहते हैं सौभाग्य से, ज्यादातर प्रक्रियाएं केवल एक "मुख्य" खिड़की होती हैं जो कि ज्यादातर समय चलती हैं, इसलिए आपको अधिकतर मामलों में अच्छे परिणाम मिलना चाहिए।

यद्यपि यह आपके प्रश्न से असंबंधित है, तो GetGUIThreadInfo फ़ंक्शन पर एक नज़र डालें ।

यह सबसे अच्छा जवाब पर आधारित शुद्ध Win32 / C ++ का उपयोग कर मेरा समाधान है। बाहरी कॉलबैक फ़ंक्शंस या संरचनाओं की आवश्यकता के बिना एक समारोह में आवश्यक सभी चीजों को लपेटना है:

 HWND FindTopWindow(DWORD pid) { std::pair<HWND, DWORD> params = { 0, pid }; // Enumerate the windows using a lambda to process each window BOOL bResult = EnumWindows([](HWND hwnd, LPARAM lParam) -> BOOL { auto pParams = (std::pair<HWND, DWORD>*)(lParam); DWORD processId; if (GetWindowThreadProcessId(hwnd, &processId) && processId == pParams->second) { // Stop enumerating SetLastError(-1); pParams->first = hwnd; return FALSE; } // Continue enumerating return TRUE; }, (LPARAM)&params); if (!bResult && GetLastError() == -1 && params.first) { return params.first; } return 0; } 

सिर्फ यह सुनिश्चित करने के लिए कि आप टीआईडी ​​(थ्रेड आईडी) और पीआईड (प्रक्रिया आईडी) को भ्रमित नहीं कर रहे हैं:

 DWORD pid; DWORD tid = GetWindowThreadProcessId( this->m_hWnd, &pid); 

Hiale के समाधान के लिए एक विस्तार के रूप में, आप एक अलग या संशोधित संस्करण प्रदान कर सकते हैं जो कई मुख्य विंडो वाली प्रक्रियाओं का समर्थन करता है।

सबसे पहले, कई संभाल के भंडारण की अनुमति देने के लिए संरचना में संशोधन करें:

 struct handle_data { unsigned long process_id; std::vector<HWND> handles; }; 

दूसरा, कॉलबैक फ़ंक्शन में संशोधन:

 BOOL CALLBACK enum_windows_callback(HWND handle, LPARAM lParam) { handle_data& data = *(handle_data*)lParam; unsigned long process_id = 0; GetWindowThreadProcessId(handle, &process_id); if (data.process_id != process_id || !is_main_window(handle)) { return TRUE; } // change these 2 lines to allow storing of handle and loop again data.handles.push_back(handle); return TRUE; } 

अंत में, मुख्य फ़ंक्शन पर रिटर्न में संशोधन करें:

 std::vector<HWD> find_main_window(unsigned long process_id) { handle_data data; data.process_id = process_id; EnumWindows(enum_windows_callback, (LPARAM)&data); return data.handles; }