MFC手动建立进程 我们已经知道了如何手动建立一个进程。但我们在建立这个进程后,我们还有很多事情需要做,比如控制这个进程的主窗口啊,移动啊等等,那么我们就需要获得这个进程的窗口信息。

EnumWindows

通过按序传递一个 Handle 到一个我们自定义的回调函数来 枚举所有在屏幕上的顶级的窗口(主窗口)。此方法会在所有的窗口都已经枚举完或我们定义的方法返回 FALSE 时结束。

BOOL EnumWindows(
WNDENUMPROC lpEnumFunc,
LPARAM lParam
);

这个方法比在一个循环中调用 GetWindow() 更安全,因为 GetWindow() 方法可能会进入无限循环或者引用一个已经销毁了的窗口。

执行成功返回 非0 值,失败返回 0 值,这时候可以调用 GetLastError() 来获取错误信息。

如果 lpEnumFunc 返回一个 0值,那么这个函数也会返回 0值。我们就需要在我们的回调函数中返回一个有意义的错误值了。

EnumWindowsProc

BOOL CALLBACK EnumWindowsProc(
_In_ HWND   hwnd,
_In_ LPARAM lParam
);

此方法接受一个顶层窗口的 Handle,我们在这里面实现我们自己的逻辑

EnumThreadWindows

枚举一个线程的非子窗口,通过将此线程拥有的窗口的 Handle 传递给我们自定义的函数来进行实现。

BOOL EnumThreadWindows(
DWORD dwThreadId,
WNDENUMPROC lpfn,
LPARAM lParam
);

这个效率应该更高呢。

FindWindow

通过窗口名(标题栏名称)或者类名来查找窗口。

HWND FindWindow(
LPCSTR lpClassName,
LPCSTR lpWindowName
);

EnumChildWindows

枚举某一窗口下的所有子窗口

BOOL EnumChildWindows(
HWND hWndParent,
WNDENUMPROC lpEnumFunc,
LPARAM lParam
);