要做一个类似于windows的任务管理器,碰到几个问题:
1.正在运行的进程都枚举出来非常多,但是在应用程序页面的任务只是一些用户程序,选择列出这些用户程序的标准是什么? 比如处在托盘的程序就没有列举出来。
2.如何通过进程id获取app的title .
3.如何获取app的程序小图标.
我通过如下的代码段获取图标句柄,为什么失败
HANDLE hSnapshot = INVALID_HANDLE_VALUE;
HICON hSmallIcon;
hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwProcId);
if (INVALID_HANDLE_VALUE == hSnapshot)
{
return NULL;
} MODULEENTRY32 me32;
me32.dwSize = sizeof(MODULEENTRY32); if (!Module32First(hSnapshot, &me32))
{
CloseHandle(hSnapshot);
return NULL;
}
return ExtractIconEx(me32.szExePath, 0, NULL, &hSmallIcon, 1);
1.正在运行的进程都枚举出来非常多,但是在应用程序页面的任务只是一些用户程序,选择列出这些用户程序的标准是什么? 比如处在托盘的程序就没有列举出来。
2.如何通过进程id获取app的title .
3.如何获取app的程序小图标.
我通过如下的代码段获取图标句柄,为什么失败
HANDLE hSnapshot = INVALID_HANDLE_VALUE;
HICON hSmallIcon;
hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwProcId);
if (INVALID_HANDLE_VALUE == hSnapshot)
{
return NULL;
} MODULEENTRY32 me32;
me32.dwSize = sizeof(MODULEENTRY32); if (!Module32First(hSnapshot, &me32))
{
CloseHandle(hSnapshot);
return NULL;
}
return ExtractIconEx(me32.szExePath, 0, NULL, &hSmallIcon, 1);
http://dev.csdn.net/develop/article/73/73632.shtm
http://www.tongyi.net/develop/C/1020237.html
1.窗口信息
MS为我们提供了打开特定桌面和枚举桌面窗口的函数。
hDesk=OpenDesktop(lpszDesktop,0,FALSE,DESKTOP_ENUMERATE);
//打开我们默认的Default桌面;
EnumDesktopWindows(hDesk,(WNDENUMPROC)EnumWindowProc,0);
//枚举打开桌面上的所有窗口,由回调函数实现。
BOOL __stdcall EnumWindowProc(HWND, LPARAM);
//在回调函数中,我们可以获得窗口的标题和相关进程,线程信息;
GetWindowText(hWnd,szWindowText,dwMaxCount);
GetWindowThreadProcessId(hWnd,&dwPID);我写的代码如下:
HDESK hDesk= OpenDesktop(L"Winlogon" /*NULL*/, 0, FALSE, DESKTOP_ENUMERATE);
if (hDesk == NULL)
{
DWORD dwError = GetLastError();
wprintf(L"%d", dwError);
}
else
{
EnumDesktopWindows(hDesk, (WNDENUMPROC)EnumWindowsProc, 0);
CloseDesktop(hDesk);
}这里的HDESK OpenDesktop(
LPTSTR lpszDesktop,
DWORD dwFlags,
BOOL fInherit,
ACCESS_MASK dwDesiredAccess) 的第一个参数是什么,看了别人的例子,用"Winlogon"代入,但是执行失败,失败码是2 .
/////////////////////////////////////////////
HWINSTA hwinstaOld;
HWINSTA hwinstaTemp;hwinstaTemp = OpenWindowStation(L"Winlogon", FALSE, DESKTOP_ENUMERATE);
if (NULL == hwinstaTemp)
{
DWORD dwError = GetLastError();
wprintf(L"%d", dwError);
return 1;
}hwinstaOld = GetProcessWindowStation();
SetProcessWindowStation(hwinstaTemp);HDESK hDesk= OpenDesktop(L"Winlogon" /*NULL*/, 0, FALSE, DESKTOP_ENUMERATE);
if (hDesk == NULL)
{
DWORD dwError = GetLastError();
wprintf(L"%d", dwError);
}
else
{
EnumDesktopWindows(hDesk, (WNDENUMPROC)EnumWindowsProc, 0);
CloseDesktop(hDesk);
}
CloseWindowStation(hwinstaTemp);
SetProcessWindowStation(hwinstaOld);
///////////////////////////////////////////仍然搞不清楚OpenWindowStation的第一个参数需要填什么 ,程序debug , OpenWindowStation返回失败.errorcode = 2;