纯WIN32 API 查找进程、枚举窗口的代码

By | 2015年8月11日

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
//根据进程名查找进程ID
DWORD FindProcess(LPCTSTR str)
{
    DWORD id = 0;
    PROCESSENTRY32 processEntry;
    HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    processEntry.dwSize = sizeof(PROCESSENTRY32);
    BOOL bRet = Process32First(hProcessSnap, &processEntry);
    while (bRet)
    {
        if ( !strcmp((char*)processEntry.szExeFile, (char*)str) )
        {
            id = processEntry.th32ProcessID;
            break;
        }
        bRet = Process32Next(hProcessSnap, &processEntry);
    }
    return id;
}
BOOL CALLBACK EnumWindowsProc(HWND hWnd,LPARAM lparam)
{
    DWORD ProcID = 0;
    GetWindowThreadProcessId(hWnd,&ProcID);
    DWORD dwMDSID = FindProcess(L"mds.exe");
    if(ProcID==dwMDSID)//如果窗口的processid等于你的ID
    {
        HWND pWnd = GetParent(hWnd);
        //得到父窗口的句柄
        while(GetParent(pWnd)!=NULL)
        {
            pWnd = GetParent(pWnd);
            //ok  pWnd 就是主窗口了
            //获取窗口句柄
            NOTIFYICONDATA nc;
            nc.hWnd = pWnd;
            nc.uID = IDI_ICON_MAIN;
            Shell_NotifyIcon(NIM_DELETE,&nc);
            ShowWindow(pWnd,SW_SHOW);
        }
    }
    return TRUE;
}
EnumWindows(EnumWindowsProc,0); //枚举窗口并用EnumWindowsProc进行回调

发表回复