Obecnie używam funkcji EnumProcesses, aby uzyskać listę uruchomionych procesów. Ponieważ moja aplikacja działa w przestrzeni użytkownika, nie jest jednak w stanie uzyskać uchwytów dla procesów nie działających pod użytkownikiem, w tym procesów systemowych. Czy istnieje inna metoda, która da mi dostęp do nich? Potrzebuję tylko nazw procesów.Uzyskaj pełną listę procesów (Visual C++)
Odpowiedz
W końcu znalazłem rozwiązanie (dane po zamieszczeniu tutaj jako moją ostatnią desperacką próbę). Jeśli ktokolwiek jeszcze potrzebuje listy nazw procesów uruchomionych w systemie (wszystkie procesy), zrobi to za Ciebie.
Zapytanie WMI (całkiem możliwe przy użyciu interfejsu COM WMI, ale trzeba przetłumaczyć dokumentację skoncentrowaną na VB (Script)) może pomóc tutaj. Klasa Win32_Process
zawiera to, czego potrzebujesz.
Jednak nie testowałem tego, myślę, że znajdziesz ten sam problem: nie-administrator może zobaczyć tylko własne procesy.
Wystarczy dodać do tej odpowiedzi, Zbudowałem to dla przypadków, gdy szukasz dla jednego konkretnego procesu zamiast całej listy.
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;
}
Należy zauważyć tutaj ten został napisany w Embarcadero RAD Studio (C++ Builder) i za @Remy_Lebeau System :: AnsiString jest klasa ciąg C++ Builder dla danych znakowych 8bit ANSI w jego ramach VCL/FMX.
Jeśli wszystko czego potrzebujesz to tylko nazwy procesu, a następnie użyć WTSEnumerateProcesses jako takie:
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;
}
Zaletą tej metody jest to, że nie trzeba otwierać każdy proces indywidualnie, a następnie odzyskać swoją nazwę jako co musielibyśmy zrobić, gdybyśmy poszli z EnumProcesses, co również nie zadziała, jeśli spróbujecie otworzyć procesy, które działają z wyższymi uprawnieniami niż konto użytkownika.
Ta metoda jest również znacznie szybsza niż wywoływanie w pętli Process32First()
/Process32Next()
.
WTSEnumerateProcesses
to mniej znany interfejs API, który jest dostępny od czasów systemu Windows XP.
- 1. Uzyskaj listę uruchomionych procesów i zabij ich usługi w tle
- 2. jak zdobyć listę procesów
- 3. Uzyskaj pełną wysokość obciętego DIV
- 4. Mongoose: Pobierz pełną listę użytkowników
- 5. Linux: Jak znaleźć listę procesów demonów i procesów zombie
- 6. Swift - Uzyskaj listę krajów
- 7. file_get_contents: uzyskaj pełną odpowiedź nawet przy błędzie
- 8. Wykrywanie spawdzonych procesów C#
- 9. Uzyskaj listę muteksów?
- 10. Uzyskaj listę unikalnych wielu zestawów
- 11. Entity Framework - Uzyskaj listę tabel
- 12. Java Reflection - Uzyskaj listę pakietów
- 13. Clojure: uzyskaj listę dopasowań regex
- 14. Uzyskaj listę wszystkich serwerów druku w domenie w języku C#
- 15. Uzyskaj wyraźną listę między dwiema listami w języku C#
- 16. Uzyskaj listę certyfikatów ze sklepu certyfikatów w języku C#
- 17. Uzyskaj listę wszystkich plików wewnątrz katalogu w vb.net
- 18. Uzyskaj pełną nazwę urządzenia audio z systemu Windows
- 19. Eliksir - Uzyskaj wszystkie PID dla procesów pod nadzorem
- 20. Jak znaleźć pełną listę dostępnych kolejek pbs torque?
- 21. Aby uzyskać pełną listę aktywnych klientów wewnątrz Xorg
- 22. Gdzie mogę znaleźć pełną listę zwycięzców nagrody Spirit of Delphi?
- 23. Jak wyświetlić listę uruchomionych procesów w programie PowerShell?
- 24. Jak znaleźć listę procesów za pomocą konkretnego modułu jądra?
- 25. Getting listę uruchomionych procesów i zabijania procesu specyficznego
- 26. Jak wyświetlić listę wszystkich procesów działających w systemie Windows?
- 27. Uzyskaj wartość dataru w C#
- 28. Pobierz pełną linię komend kompilatora C++
- 29. Erlang spawning duże ilości procesów C
- 30. Uzyskaj listę kluczy pamięci podręcznej w Django
Może Cię to zainteresować: http://stackoverflow.com/q/30604485/560648. –
Dziękuję, powinienem zauważyć, że to zostało napisane w Embarcadero RAD Studio (C++ Builder) i na @Remy_Lebeau System :: AnsiString jest klasą napisową C++ Builder dla 8-bitowych danych ANSI w swoich frameworkach VCL/FMX. – Phil
Zdecydowanie warto dodać ten szczegół do odpowiedzi! Twoje zdrowie. –