自动化操作的第一步就是要启动目标应用程序,然后获取窗口句柄,通常是一个登录窗口,但CreateProcess这样的API并不是完全拥塞式的,也就是说它会在子进程未初化完成时返回,应该用什么样比较优雅的地创建目标进程并获取其窗口句柄,希望大家多给些思路C#里有个Process类(using System.Diagnostics),它可以用于启动进程,并且有一个MainWindowHandle属性用于获取目标进程的主窗口句柄,看以下代码
            proc = Process.Start(@"NOTEPAD.exe");
            Trace.WriteLine("started");
            Trace.WriteLine("mainWindowHandle:" + proc.MainWindowHandle);第二个输入基本上都会是0,我想Process在后台也会调用CreateProcess API(并在CreateProcess后调用EnumWindows、GetWindowProcessThreadId之类的API获取数据并匹配出该进程主窗口,说的不对的大家指教),也就是说,在目标进程的窗口未创建出来时Start就返回了,接着proc.MainWindowHandle的调用自然就是0,什么也得不到对上面的代码修改一下,等待一小段
            proc = Process.Start(@"NOTEPAD.exe");
            Trace.WriteLine("started");
            Thread.Sleep(100);
            Trace.WriteLine(proc.MainWindowHandle);
很好,MainWindowHandle出现了正确的值,但Thread.Sleep到底要等待多久呢,这是无法确定的,最要命的是如果第一个输出MainWindowsHandle为0,那么以后无论再等待多久,MainWindowsHandle还是0,代码如下
            proc = Process.Start(@"NOTEPAD.exe");
            Trace.WriteLine("started");
            Trace.WriteLine(proc.MainWindowHandle);
            Thread.Sleep(100);
            Trace.WriteLine(proc.MainWindowHandle);希望大家多给一些好的思路