最近在做Windows Mobile 6.1/6.5的UI Automation,其中涉及到一个很常用的API:FindWindow
MSDN上的链接如下:
http://msdn.microsoft.com/en-us/library/aa929233.aspx
Syntax:
HWND FindWindow( LPCTSTR lpClassName, LPCTSTR lpWindowName );
这是个很简单的API,我所要和您分享的经验是:
一、中文问题
我在.Net中用PInvoke封装它,曾经遇到过英文标题的窗体能够找到、中文标题的窗口无法找到的问题,后来加上了 CharSet = CharSet.Unicode 的属性,完美解决。
如下:
[DllImport("coredll.dll", EntryPoint = "FindWindow", SetLastError = true, CallingConvention = CallingConvention.Winapi, CharSet = CharSet.Unicode)] public static extern IntPtr FindWindow(string className, string windowName);
二、 lpClassName 与 lpWindowName 都相同的窗体,调用 FindWindow 查找会失败
这是最近在 Windows Mobile 6.5 系统上发现的一个现象,其余版本尚未检验。例如,有3个窗体的ClassName都是Dialog,WindowName都是“电话”,如果你调用FindWindow("Dialog", @"电话"),得到的结果是 NULL,GetLastError得到的是ERROR_INVALID_HANDLE。
目前我尚无很好的解决办法,唯一能做的就是枚举出所有窗体,然后根据窗体的Handle查找其ClassName、WindowName,看看哪些符合ClassName=="Dialog"、WindowName=="电话",然后再通过筛选出来的窗体是否含有我期望的Controls来判断究竟哪一个窗体才是我真正想要的。
各位有什么好办法没有,请赐教,多谢!