例如,写一个函数
HWND getMainWin(DWORD idProcess,int &type)输入参数是一个进程的id。功能:1.返回这个进程的主窗口(如果有的话)HWND,没有窗口,就返回NULL.
2.type作为返回的参数。如果主窗口是一个对话框,那么type写入1,如果是普通窗口,返回2,是MDI,返回3以上的需求能做到么,有哪点是做不到的? 如果能做到,大概需要怎么做?谢谢,请讨论和指教。100分。
HWND getMainWin(DWORD idProcess,int &type)输入参数是一个进程的id。功能:1.返回这个进程的主窗口(如果有的话)HWND,没有窗口,就返回NULL.
2.type作为返回的参数。如果主窗口是一个对话框,那么type写入1,如果是普通窗口,返回2,是MDI,返回3以上的需求能做到么,有哪点是做不到的? 如果能做到,大概需要怎么做?谢谢,请讨论和指教。100分。
2.type作为返回的参数。如果主窗口是一个对话框,那么type写入1,如果是普通窗口,返回2,是MDI,返回
==============================
对一个进程来说,它可能有多个窗口,而且这个多个窗口之间的关系并不一定是父子关系,这样的话,你所说的主窗口就无从谈起了,因为可能有多个窗口都算是主窗口。
要找出主窗口,有点难
因为是这样,我觉得不论dialog,sdi,mdi,创建了一个最顶层的窗口以后,其他的窗口在创建的时候一般都要指定父窗口。假设程序里面其他的窗口对象在创建的时候,都严格指定了顶层窗口作为父窗口。
那么枚举函数之类的调用,第一个返回的是否可以肯定是这个顶层窗口呢?请继续指教。
如果基于你这种假设,那么上面说的:
EnumWindows + GetWindowThreadProcessId + GetClassName
这三个API基本上能满足你的要求,但是枚举窗口时第一个窗口是不是一定就是顶层窗口,这个可能不一定,没试过,不太好说。
我的问题是,如何枚举另一个进程id所指向的,窗口。可以做到么。
BOOL EnumWindows( WNDENUMPROC lpEnumFunc,
LPARAM lParam
);BOOL CALLBACK EnumWindowsProc( HWND hwnd,
LPARAM lParam
);EnumWindows(EnumWindowsProc,(lParam)idProcess);
// 根据ID找到窗口句柄
typedef struct _WNDINFO_
{
HWND hWnd;
DWORD dwProcessId;
}WNDINFO, *PWNDINFO;BOOL CALLBACK EnumWindowProc(HWND hWnd, LPARAM lParam)
{
WNDINFO* pInfo = (WNDINFO*)lParam;
DWORD dwProcessId = 0;
GetWindowThreadProcessId(hWnd, &dwProcessId);
if(dwProcessId == pInfo->dwProcessId)
{
pInfo->hWnd = hWnd;
return FALSE;
}
return TRUE;
}HWND GetProcessMainHwnd(DWORD dwProcessId)
{
WNDINFO info = {0};
info.dwProcessId = dwProcessId;
EnumWindows(EnumWindowProc, (LPARAM)&info);
return info.hWnd;
}