Tôi hiện đang sử dụng chức năng EnumProcesses để lấy danh sách các quy trình đang chạy. Vì ứng dụng của tôi chạy trong không gian người dùng, tuy nhiên, nó không thể nhận được các xử lý cho các tiến trình không chạy dưới người dùng, bao gồm các tiến trình Hệ thống. Có phương pháp nào khác sẽ cho tôi quyền truy cập vào các phương pháp này không? Tất cả những gì tôi cần là tên quy trình.Nhận danh sách quy trình đang chạy đầy đủ (Visual C++)
Trả lời
Cuối cùng tôi đã tìm thấy một giải pháp (con số sau khi đăng bài ở đây là nỗ lực tuyệt vọng cuối cùng của tôi). Nếu bất kỳ ai khác chỉ cần một danh sách các tên quy trình đang chạy trên hệ thống (tất cả các quy trình), điều này sẽ làm điều đó cho bạn.
Truy vấn WMI (hoàn toàn có thể sử dụng giao diện COM của WMI, nhưng bạn cần dịch tài liệu tập trung VB (Tập lệnh)) có thể trợ giúp tại đây. Lớp học Win32_Process
chứa những gì bạn cần.
Tuy nhiên, tôi chưa thử nghiệm điều này, tôi nghĩ bạn sẽ tìm thấy cùng một vấn đề: người không phải quản trị viên chỉ có thể xem quy trình của riêng họ.
Chỉ cần để thêm vào câu trả lời này, tôi đã xây dựng này đối với trường hợp khi bạn đang tìm kiếm chỉ là một quá trình cụ thể thay vì toàn bộ danh sách.
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;
}
tôi nên lưu ý ở đây điều này đã được viết bằng Embarcadero RAD Studio (C++ Builder) và mỗi hệ thống @Remy_Lebeau :: AnsiString là một chuỗi lớp C++ Builder cho dữ liệu nhân vật 8bit ANSI trong khuôn khổ VCL/FMX của nó.
Nếu tất cả bạn cần chỉ là cái tên quá trình, sau đó sử dụng WTSEnumerateProcesses như vậy:
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;
}
Lợi ích của việc sử dụng phương pháp này là bạn không cần phải mở mỗi quá trình cá nhân và sau đó lấy tên của nó như bạn sẽ phải làm gì nếu bạn đã thay đổi bằng cách sử dụng EnumProcesses, điều này cũng sẽ không hoạt động nếu bạn cố gắng mở các quy trình chạy với đặc quyền cao hơn tài khoản người dùng của bạn.
Ngoài ra, phương pháp này cũng nhanh hơn nhiều so với gọi số Process32First()
/Process32Next()
trong vòng lặp.
WTSEnumerateProcesses
là một API ít được biết đến đã có sẵn từ Windows XP.
- 1. Lấy danh sách đầy đủ các quy trình của Windows trong C
- 2. Danh sách quy trình hiện đang chạy trong Go
- 3. Tên quy trình đầy đủ từ task_struct
- 4. Nhận backtrace ngăn xếp của một quy trình đang chạy
- 5. Nhận quy trình đang chạy xử lý được xử lý
- 6. Phát hiện xem chương trình có đang chạy với đầy đủ quyền quản trị viên
- 7. Tải danh sách quy trình đang chạy và xóa dịch vụ nền của chúng
- 8. mẫu không đầy đủ trong Haskell danh sách hiểu
- 9. Python: Danh sách đầy đủ các mô-đun
- 10. Mẫu Live Intellij trong Code Danh sách đầy đủ
- 11. Chưa đầy đủ các danh sách khác nhau
- 12. Sự kiện DOM Backbone.js đầy đủ danh sách
- 13. Nhận danh sách đầy đủ các lệnh có sẵn cho DTE.ExecuteCommand
- 14. Chuyển đối số cho quy trình đang chạy trong C#
- 15. iOS FBRequestConnection startForMyFriendsWithCompletionHandler nhận được danh sách đầy đủ của bạn bè
- 16. Danh sách đầy đủ các thẻ nhận xét Java đặc biệt
- 17. Làm cách nào để nhận được url đầy đủ của trang tôi đang ở trong C#
- 18. cách lấy danh sách quy trình
- 19. Gỡ lỗi quy trình python đang chạy
- 20. Lấy danh sách các thư viện đã sử dụng bằng một tiến trình đang chạy (unix)
- 21. Nhận tên miền từ URL đầy đủ
- 22. Tạo C# Loại từ tên đầy đủ
- 23. Tại sao có các biến tương tự của tôi với một ':' trong danh sách đầy đủ tự động Visual Studio?
- 24. Băng chuyền đầy đủ chiều rộng đầy đủ với carouFredSel.js
- 25. iOS: Nơi để tìm danh sách đầy đủ mã OSStatus cho iOS?
- 26. Sử dụng các mẫu không liên kết với Danh sách đầy đủ trong Haskell
- 27. Danh sách đầy đủ các phần mở rộng tệp hợp lệ cho hình ảnh là gì?
- 28. Làm cách nào để có danh sách đầy đủ tất cả các truy vấn hiện đang chạy trên máy chủ MySQL của tôi?
- 29. F #: cách in danh sách đầy đủ (Console.WriteLine() chỉ in ba phần tử đầu tiên)
- 30. Danh sách đầy đủ của tất cả các thư mục tài nguyên Android?
Bạn có thể quan tâm đến điều này: http://stackoverflow.com/q/30604485/560648. –
Cảm ơn, tôi nên lưu ý ở đây này được viết trong Embarcadero RAD Studio (C++ Builder) và mỗi @Remy_Lebeau System :: AnsiString là lớp chuỗi C++ Builder cho dữ liệu ký tự 8 bit ANSI trong khung công tác VCL/FMX của nó. – Phil
Chắc chắn giá trị thêm chi tiết đó vào câu trả lời của bạn! Chúc mừng. –