|
为了解决这个问题http://bbs.c3.wuyou.net/forum.php?mod=viewthread&tid=437483,我前两天写了个程序,今天又给它优化了一下,可选区分大小写,支持通配符,cmd窗口无参数运行程序即可看使用方法。
- #include <windows.h>
- #include <tlhelp32.h>
- #include <stdio.h>
- #include <stdbool.h>
- #include <string.h>
- typedef struct {
- char name[MAX_PATH];
- int count;
- } ProcessInfo;
- bool WildcardMatch(const char *, const char *, bool);
- int GetProcessCount(const char *processName, bool caseSensitive, ProcessInfo *processes, int maxProcesses) {
- int count = 0;
- HANDLE hProcessSnap;
- PROCESSENTRY32 pe32;
- hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
- if (hProcessSnap == INVALID_HANDLE_VALUE) {
- fprintf(stderr, "CreateToolhelp32Snapshot 失败。错误:%lu\n", GetLastError());
- return -1;
- }
- pe32.dwSize = sizeof(PROCESSENTRY32);
- if (Process32First(hProcessSnap, &pe32)) {
- do {
- bool match = false;
- if (caseSensitive) {
- if (strcmp(processName, pe32.szExeFile) == 0 || WildcardMatch(processName, pe32.szExeFile, caseSensitive)) {
- match = true;
- }
- } else {
- char processNameLower[MAX_PATH];
- strcpy(processNameLower, processName);
- strlwr(processNameLower);
- char pe32ExeFileLower[MAX_PATH];
- strcpy(pe32ExeFileLower, pe32.szExeFile);
- strlwr(pe32ExeFileLower);
- if (strcmp(processNameLower, pe32ExeFileLower) == 0
- || WildcardMatch(processNameLower, pe32ExeFileLower, caseSensitive)) {
- match = true;
- }
- }
- if (match) {
- bool found = false;
- for (int i = 0; i < count; i++) {
- if (strcmp(processes[i].name, pe32.szExeFile) == 0) {
- processes[i].count++;
- found = true;
- break;
- }
- }
- if (!found && count < maxProcesses) {
- strncpy(processes[count].name, pe32.szExeFile, MAX_PATH - 1);
- processes[count].name[MAX_PATH - 1] = '\0';
- processes[count].count = 1;
- count++;
- }
- }
- } while (Process32Next(hProcessSnap, &pe32));
- }
- CloseHandle(hProcessSnap);
- return count;
- }
- int main(int argc, char *argv[]) {
- if (argc < 2) {
- fprintf(stderr, "用法:%s <进程名称> [/c (区分大小写)]\n"
- "支持通配符#和;,与cmd的*和?用法相同,不用*和?是因为在cmd中执行会被解析\n", argv[0]);
- return 1;
- }
- const char *processName = argv[1];
- bool caseSensitive = false;
- if (argc == 3 && strcmp(argv[2], "/c") == 0) {
- caseSensitive = true;
- }
- const int maxProcesses = 100;
- ProcessInfo processes[maxProcesses];
- int count = GetProcessCount(processName, caseSensitive, processes, maxProcesses);
- if (count == -1) {
- fprintf(stderr, "获取进程数量失败。\n");
- } else {
- int total = 0;
- for (int i = 0; i < count; i++) {
- printf("%-30s:%d\n", processes[i].name, processes[i].count);
- total += processes[i].count;
- }
- if (count != 1) {
- printf("%-30s:%d", argv[1], total);
- }
- }
- return 0;
- }
- bool WildcardMatch(const char *pattern, const char *string, bool caseSensitive) {
- if (*pattern == '\0' && *string == '\0') {
- return true;
- }
- if (*pattern == '#' && *(pattern + 1) != '\0' && *string == '\0') {
- return false;
- }
- if (*pattern == ';' || (caseSensitive ? (*pattern == *string) : (tolower(*pattern) == tolower(*string)))) {
- return WildcardMatch(pattern + 1, string + 1, caseSensitive);
- }
- if (*pattern == '#') {
- return WildcardMatch(pattern + 1, string, caseSensitive) || WildcardMatch(pattern, string + 1, caseSensitive);
- }
- return false;
- }
复制代码
源码及程序下载:pan.baidu.com/s/1L7MYeSsJGlxENVQx2S08Mw?pwd=xfxi |
评分
-
查看全部评分
|