2011-06-01 14 views
9

मैंने प्रक्रिया में अपना डीएल इंजेक्शन दिया है। मैं होस्ट एप्लिकेशन के मुख्य विंडो हैंडल कैसे प्राप्त कर सकता हूं?Win32 - आवेदन के मुख्य WND हैंडल प्राप्त करें

+12

मुझे लगता है कि "पीड़ित आवेदन" "मेजबान आवेदन" से बेहतर शब्द है। अगर बंदूकधारियों ने मेरे घर में घुसपैठ की और मुझे बंधक बना दिया, तो मैं मेजबान नहीं, पीड़ित होगा। –

उत्तर

34

होस्ट एप्लिकेशन में कई 'मुख्य विंडो' हो सकती हैं। उन्हें पता लगाने के लिए, आपको

  1. कॉल GetCurrentProcessId मौजूदा प्रक्रिया
  2. कॉल EnumWindows की पीआईडी ​​डेस्कटॉप
  3. के सभी उच्चस्तरीय खिड़कियों से अधिक पुनरावृति करने के लिए डेस्कटॉप पर प्रत्येक विंडो के लिए, GetWindowThreadProcessId फोन प्राप्त करने के लिए प्राप्त करने के लिए कर सकता है प्रक्रिया का पीआईडी ​​जिसने विंडो
  4. बनाया है यदि विंडो की पीआईडी ​​आपकी प्रक्रिया के पीआईडी ​​से मेल खाती है, तो विंडो को याद रखें।

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

यहां इस एल्गोरिदम को लागू करने वाला एक C++ फ़ंक्शन है। यह getToplevelWindows फ़ंक्शन लागू करता है जो std::vector<HWND> उत्पन्न करता है जिसमें वर्तमान प्रक्रिया की सभी अपूर्ण विंडो के हैंडल होते हैं।

struct EnumWindowsCallbackArgs { 
    EnumWindowsCallbackArgs(DWORD p) : pid(p) { } 
    const DWORD pid; 
    std::vector<HWND> handles; 
}; 

static BOOL CALLBACK EnumWindowsCallback(HWND hnd, LPARAM lParam) 
{ 
    EnumWindowsCallbackArgs *args = (EnumWindowsCallbackArgs *)lParam; 

    DWORD windowPID; 
    (void)::GetWindowThreadProcessId(hnd, &windowPID); 
    if (windowPID == args->pid) { 
     args->handles.push_back(hnd); 
    } 

    return TRUE; 
} 

std::vector<HWND> getToplevelWindows() 
{ 
    EnumWindowsCallbackArgs args(::GetCurrentProcessId()); 
    if (::EnumWindows(&EnumWindowsCallback, (LPARAM) &args) == FALSE) { 
     // XXX Log error here 
     return std::vector<HWND>(); 
    } 
    return args.handles; 
} 

अद्यतन: इन दिनों (के बारे में चार साल के बाद मैं जवाब दिया) मैं भी प्रत्येक थ्रेड पर EnumThreadWindows का उपयोग कर आवेदन के traversing the list of threads और उसके बाद विचार किया जाएगा। मैंने देखा कि यह कई मामलों में काफी तेज है।

+2

तुम मेरे भगवान हो। – Hooch

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