2010-08-13 13 views
14

प्राप्त करें मैं वर्तमान में चल रही प्रक्रियाओं की एक सूची प्राप्त करने के लिए EnumProcesses फ़ंक्शन का उपयोग कर रहा हूं। चूंकि मेरा एप्लिकेशन उपयोगकर्ता स्थान में चलता है, हालांकि, यह सिस्टम प्रक्रियाओं सहित उपयोगकर्ता के अंतर्गत चल रही प्रक्रियाओं के लिए हैंडल प्राप्त करने में सक्षम नहीं है। क्या कोई और तरीका है जो मुझे इन तक पहुंच प्रदान करेगा? मुझे बस प्रक्रिया के नाम की जरूरत है।पूर्ण चलने की प्रक्रिया सूची (विज़ुअल सी ++)

उत्तर

9

मुझे अंततः एक समाधान मिला (मेरे आखिरी हताश प्रयास के रूप में यहां पोस्ट करने के बाद आंकड़े)। अगर किसी और को केवल सिस्टम (सभी प्रक्रियाओं) पर चल रहे प्रक्रिया नामों की एक सूची की आवश्यकता है, तो यह आपके लिए यह करेगा।

Process Walking

0

एक डब्लूएमआई क्वेरी (डब्लूएमआई के इंटरफ़ेस का उपयोग करके काफी संभव है, लेकिन आपको वीबी (स्क्रिप्ट) केंद्रित दस्तावेज़ों का अनुवाद करने की आवश्यकता होगी) यहां सहायता कर सकती है। Win32_Process कक्षा में आपको जो चाहिए वह है।

हालांकि, मैंने इसका परीक्षण नहीं किया है, मुझे लगता है कि आपको एक ही समस्या मिल जाएगी: एक गैर-प्रशासक केवल अपनी प्रक्रिया देख सकता है।

8

बस इस जवाब में जोड़ने के लिए, मैं मामलों के लिए इस का निर्माण किया है जब आप देख रहे हैं पूरी सूची के बजाय सिर्फ एक विशेष प्रक्रिया के लिए।

bool FindRunningProcess(AnsiString process) { 
/* 
Function takes in a string value for the process it is looking for like ST3Monitor.exe 
then loops through all of the processes that are currently running on windows. 
If the process is found it is running, therefore the function returns true. 
*/ 
    AnsiString compare; 
    bool procRunning = false; 

    HANDLE hProcessSnap; 
    PROCESSENTRY32 pe32; 
    hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); 

    if (hProcessSnap == INVALID_HANDLE_VALUE) { 
     procRunning = false; 
    } else { 
     pe32.dwSize = sizeof(PROCESSENTRY32); 
     if (Process32First(hProcessSnap, &pe32)) { // Gets first running process 
      if (pe32.szExeFile == process) { 
       procRunning = true; 
      } else { 
       // loop through all running processes looking for process 
       while (Process32Next(hProcessSnap, &pe32)) { 
        // Set to an AnsiString instead of Char[] to make compare easier 
        compare = pe32.szExeFile; 
        if (compare == process) { 
         // if found process is running, set to true and break from loop 
         procRunning = true; 
         break; 
        } 
       } 
      } 
      // clean the snapshot object 
      CloseHandle(hProcessSnap); 
     } 
    } 

    return procRunning; 
} 

मैं यहाँ ध्यान देना चाहिए इस Embarcadero रेड स्टूडियो (सी ++ बिल्डर) @Remy_Lebeau प्रणाली में और प्रति लिखा गया था :: AnsiString अपने VCL/FMX चौखटे में 8 बिट एएनएसआई चरित्र डेटा के लिए एक सी ++ बिल्डर स्ट्रिंग वर्ग है।

+0

आपको इसमें रुचि हो सकती है: http://stackoverflow.com/q/30604485/560648। –

+0

धन्यवाद, मुझे यहां ध्यान देना चाहिए कि यह एम्बरकेडरो आरएडी स्टूडियो (सी ++ बिल्डर) और प्रति @ रेमी_लेबेउ सिस्टम में लिखा गया था :: AnsiString अपने वीसीएल/एफएमएक्स फ्रेमवर्क में 8 बिट एएनएसआई चरित्र डेटा के लिए एक सी ++ बिल्डर स्ट्रिंग क्लास है। – Phil

+0

निश्चित रूप से उस विवरण को आपके उत्तर में जोड़ने के लायक है! चीयर्स। –

1

आप सभी की जरूरत सिर्फ प्रक्रिया के नाम हैं, तो इस तरह के रूप WTSEnumerateProcesses का उपयोग करें:

WTS_PROCESS_INFO* pWPIs = NULL; 
DWORD dwProcCount = 0; 
if(WTSEnumerateProcesses(WTS_CURRENT_SERVER_HANDLE, NULL, 1, &pWPIs, &dwProcCount)) 
{ 
    //Go through all processes retrieved 
    for(DWORD i = 0; i < dwProcCount; i++) 
    { 
     //pWPIs[i].pProcessName = process file name only, no path! 
     //pWPIs[i].ProcessId = process ID 
     //pWPIs[i].SessionId = session ID, if you need to limit it to the logged in user processes 
     //pWPIs[i].pUserSid = user SID that started the process 
    } 
} 

//Free memory 
if(pWPIs) 
{ 
    WTSFreeMemory(pWPIs); 
    pWPIs = NULL; 
} 

इस पद्धति का उपयोग करने का लाभ यह है कि आप व्यक्तिगत रूप से प्रत्येक प्रक्रिया खोलें और फिर जैसा कि इसके नाम को पुनः प्राप्त करने की जरूरत नहीं है है यदि आप EnumProcesses के साथ गए तो आपको क्या करना होगा, यदि आप अपने उपयोगकर्ता खाते की तुलना में उच्च विशेषाधिकारों के साथ चलने वाली प्रक्रियाओं को खोलने का प्रयास करते हैं तो यह भी काम नहीं करेगा।

इसके अतिरिक्त यह विधि लूप में Process32First()/Process32Next() पर कॉल करने से भी अधिक तेज़ है।

WTSEnumerateProcesses एक कम ज्ञात एपीआई है जो विंडोज एक्सपी के बाद से उपलब्ध है।

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