.net CF 1.x 是不支持CallBack(回调)的,所以我们无法用EnumWindows 这个API函数来枚举系统当前所有运行程序的窗口,这里我们可以通过其它的API函数来实现EnumWindows 的功能。(.net CF 2.0中就已经支持CallBack了,无奈.net CF2 还不够普及,这对用.net CF进行windows mobile开发的人来说限制是致命的,我们不得不费很多的精力去实现本来很简单的功能,这也是我为自己blog取名为“历险”的原因,因为在.net CF开发过程中有很多始料未及的问题,并非是技术原因,而是.net CF1.x本身的问题——封装太差)
public static Window[] EnumerateTopWindows()
{
ArrayList winList = new ArrayList();
IntPtr hwnd = IntPtr.Zero;
Window window = null;
StringBuilder sb = null;
// 获取第一个窗口
hwnd = GetActiveWindow();
hwnd = GetWindow(hwnd, GW_HWNDFIRST);
while(hwnd != IntPtr.Zero)
{
IntPtr parentWin = GetParent(hwnd);
// Make sure that the window doesn't have a parent
if ((parentWin == IntPtr.Zero))
{
int length = GetWindowTextLength(hwnd);
// 检验是否为有效的窗体
if (length > 0)
{
window = new Window();
window.Handle = hwnd;
sb = new StringBuilder(length + 1);
GetWindowText(hwnd, sb, sb.Capacity);
window.Caption = sb.ToString();
winList.Add(window);
}
}
hwnd = GetWindow(hwnd, GW_HWNDNEXT);
}
return (Window[])winList.ToArray(typeof(Window));
}