2014-01-08 78 views
1

我有一个C#程序。该程序创建一个Adobe Reader进程并打印一个PDF文档。它工作在Windows XP中正常,但在Windows 7我已经检查不工作的AcroRd32.exe路径是正确的在Windows 7的FindWindow方法总是返回0在Windows 7FindWindow在Windows 7中返回0

[DllImport("user32.dll")] 
    public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow); 

    [DllImport("User32.dll")] 
    public static extern IntPtr FindWindow(string ClassN, string WindN); 

    [DllImport("user32.dll", EntryPoint = "SendMessageA")] 
    private static extern int SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam); 

    [DllImport("user32.dll", SetLastError = true)] 
    static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow); 

    [DllImport("shell32.dll ")] 
    public static extern int ShellExecute(IntPtr hwnd, string lpszOp, string lpszFile, string lpszParams, string lpszDir, int FsShowCmd); 

    [DllImport("kernel32.dll", CharSet = CharSet.Auto)] 
    public static extern uint WinExec(string lpCmdLine, uint uCmdShow); 

    public bool isAcrobatExsists(string acrobatLoc) 
    { 
     IntPtr currentHandle = getWindowHandlerByClass("AcrobatSDIWindow"); 
     if (currentHandle != IntPtr.Zero) 
     { 
      return true; 
     } 
     return false; 
    } 

    private static IntPtr getWindowHandlerByClass(string className) 
    { 
     IntPtr currentHandle = FindWindow(className, null); 
     return currentHandle; 
    } 

    private static IntPtr getWindowHandlerByName(string appName) 
    { 
     IntPtr currentHandle = FindWindow(null, appName); 
     return currentHandle; 
    } 
+1

你是如何调用'getWindowHandlerByName()'?我启动了Adobe Reader X,运行你的代码(调用'getWindowHandlerByName(“Adobe Reader”);'),并找回了一个有效的句柄。 –

+0

我试过了。它仍然返回0。 – user3171372

回答

1

FindWindow函数可以依赖很大处理你如何运行应用程序。这听起来像你可能将它作为计划任务或Windows服务运行。这些运行在与用户桌面窗口不同的会话中,因此它不会看到或能够与它们交互。

他们在Windows Vista中引入了此更改,因此,这样做的应用程序在XP中可以正常工作,但在Windows Vista或更高版本中会失败。

下面是从MSDN它的链接:Application Compatibility: Session 0 isolation