2012-07-29 18 views
7

द्वारा एचडब्ल्यूएन प्राप्त करें यदि मैं प्रक्रिया आईडी जानता हूं, तो मैं आवेदन के एचडब्ल्यूएनडी कैसे प्राप्त कर सकता हूं? कोई भी नमूना पोस्ट कर सकता है? मैं एमएसवी सी ++ 2010 का उपयोग कर रहा हूं। मुझे प्रक्रिया :: मेनविंडो हैंडल मिला लेकिन मुझे नहीं पता कि इसका उपयोग कैसे किया जाए।प्रक्रिया आईडी C++

+1

एक प्रक्रिया 1 विंडो तक सीमित नहीं है। – chris

+1

एक प्रक्रिया में कई खिड़कियां हो सकती हैं, और इसमें कई hwnds हैं। –

+0

तो, मैबी सभी एचडब्ल्यूएनडी प्राप्त करना और इन्हें चुनना संभव है, जिनके पास यह प्रक्रिया आईडी है? – Luke

उत्तर

16
HWND g_HWND=NULL; 
BOOL CALLBACK EnumWindowsProcMy(HWND hwnd,LPARAM lParam) 
{ 
    DWORD lpdwProcessId; 
    GetWindowThreadProcessId(hwnd,&lpdwProcessId); 
    if(lpdwProcessId==lParam) 
    { 
     g_HWND=hwnd; 
     return FALSE; 
    } 
    return TRUE; 
} 
EnumWindows(EnumWindowsProcMy,m_ProcessId); 
+1

यह मेरे लिए पनीर की तरह काम करता है .. – Nadun

+1

किसी को यह इंगित करने की आवश्यकता है कि 'पीआईडी' उसी विधि से संबंधित होना चाहिए (या इंटरैक्टिव उपयोगकर्ता/लॉगऑन सत्र) जिस प्रक्रिया को आप इस विधि से कहते हैं। अन्यथा 'EnumWindows' इसकी विंडो हैंडल की गणना नहीं करेगा। उदाहरण के लिए, आप इस विधि का उपयोग किसी सेवा से नहीं कर सकते हैं, या यदि प्रश्न में प्रक्रिया उपयोगकर्ता खाते पर एक अलग लॉग के तहत चलती है, या वर्कस्टेशन लॉक होने पर स्क्रीनसेवर के लिए एचडब्ल्यूएनडी पुनर्प्राप्त करने के लिए, – c00000fd

+0

बस इस कोड को मुफ्त में परिवर्तित कर दिया गया है पास्कल और मेरे लिए पनीर की तरह काम करता है :) – Jako

3

आप इस MSDN article में उल्लिखित EnumWindows और GetWindowThreadProcessId() फ़ंक्शंस का उपयोग कर सकते हैं।

0

एक एकल पीआईडी ​​(प्रक्रिया आईडी) एक से अधिक खिड़की (एचडब्ल्यूएनडी) से जुड़ा जा सकता है। उदाहरण के लिए यदि एप्लिकेशन कई विंडोज़ का उपयोग कर रहा है।
निम्नलिखित कोड किसी दिए गए पीआईडी ​​प्रति सभी विंडोज़ के हैंडल का पता लगाता है।

void GetAllWindowsFromProcessID(DWORD dwProcessID, std::vector <HWND> &vhWnds) 
{ 
    // find all hWnds (vhWnds) associated with a process id (dwProcessID) 
    HWND hCurWnd = NULL; 
    do 
    { 
     hCurWnd = FindWindowEx(NULL, hCurWnd, NULL, NULL); 
     DWORD dwProcessID = 0; 
     GetWindowThreadProcessId(hCurWnd, &dwProcessID); 
     if (dwProcessID == dwProcessID) 
     { 
      vhWnds.push_back(hCurWnd); // add the found hCurWnd to the vector 
      wprintf(L"Found hWnd %d\n", hCurWnd); 
     } 
    } 
    while (hCurWnd != NULL); 
} 
संबंधित मुद्दे