假如使用adobe reader 打开两份pdf文档(是同一进程), 使用什么api 可以找到 最后打开的pdf文档 的窗口句柄呢? 谢谢

解决方案 »

  1.   


    e ....谢谢啊,,,忘了 说明,,, 我是用一个进程  打开另一个进程(adobe reader),,这个 时间控件 检查不到所有吧?
      

  2.   

    你用进程打开一个进程...你打开的时候知道了进程ID ...怎么会是进程ID不同呢.
    这里你直接就知道了谁先打开谁后打开的... 你有了进程ID 然后枚举所有装体..根据窗体句柄获取进程ID 判断ID是一样就说明你是程序打开的进程... 记录句柄  你有了进程ID 不就知道进程的启动时间....判断时间获取最后一个不就好了?
    没看出什么复杂的.//根据窗体句柄获取进程ID
    [DllImport("user32.dll")]
            public static extern IntPtr GetWindowThreadProcessId(IntPtr hwnd, ref int lpdwProcessId);//枚举所有窗体
     [DllImport("user32.dll")]
            public static extern int EnumWindows(EnumWindowsProc ewp, int lParam); public delegate bool EnumWindowsProc(IntPtr p_Handle, int p_Param);
      

  3.   


    谢谢 你 解释 的这么 详细。  我说明几点,如下:
    1、我的应用程序MyApp, 打开pdf文档,pdf文档的关联文件是Adobe Reader。利用Process prc= new Process();
    prc.startinfo.filename="xxx.pdf";
    prc.start();2、当我打开这个xxx.pdf之前,存在了一个已经打开的pdf,假设为yyy.pdf。 如果我想要在MyApp中操作xxx.pdf,那么,我就需要找到xxx.pdf的句柄,而不是yyy.pdf的句柄。 而这时用 FindWindow(null,prc.MainWindowTitle),prc.MainWindowTitle为空,我想,难道是adober reader打开文档需要些时间?我就在FindWindow之前加入了Thread.sleep(500),结果在FindWindow方法中会抛出进程已经存在的异常。3、当我打开xxx.pdf 后,这时只有一个adobe reader的进程在运行。
    我要将xxx.pdf 置为TopMost,既z-order的最顶层。 这时,只有找到xxx.pdf的句柄才可以,
    EnumWindows 我正尝试。
    可能我上述方法,有不正确的,希望指正。谢谢
      

  4.   


    我在7楼写的Thread.sleep(500)和 FindWindow方法,,对于打开xxx.pdf之前,没有存在已经打开的pdf文档时, 是 可以 找到xxx.pdf的句柄的。