我想将PDF查看器作为一个不可见的进程启动,强制它成为一个控件,然后再次显示它.但观众似乎拒绝开始看不见.我已经try 了这些启动参数:

ProcessStartInfo pdfViewerStartInfo = new ProcessStartInfo(ApplikationsName, "\"" + path + "\"");
        pdfViewerStartInfo.WindowStyle = ProcessWindowStyle.Hidden;
        pdfViewerStartInfo.RedirectStandardInput = true;
        pdfViewerStartInfo.RedirectStandardOutput = false;
        pdfViewerStartInfo.UseShellExecute = false;
        pdfViewerStartInfo.CreateNoWindow = true;

有什么我可以做的来强制查看器开始不可见(也许是Win32 API)?

推荐答案

将PDF查看器作为不可见进程启动,然后将其强制到控件中,同时使其不可见可能有点棘手,因为许多PDF查看器都被设计为具有自己的窗口和用户界面的图形用户界面应用程序.但是,您可以try 几种不同的方法来实现您的目标:

使用无头PDF查看器: 如果您只需要从PDF中提取图像或文本而不向用户显示,请考虑使用无头PDF查看器,如pdftoppm(Poppler库的一部分)或MuPDF.这些命令行工具没有图形界面,因此它们可以在后台不可见地运行.

使用pdftoppm将PDF页面转换为图像的示例:

ProcessStartInfo pdfToImageStartInfo = new ProcessStartInfo("pdftoppm", "\"" + path + "\" outputimage -png");
pdfToImageStartInfo.WindowStyle = ProcessWindowStyle.Hidden;
pdfToImageStartInfo.UseShellExecute = false;
pdfToImageStartInfo.CreateNoWindow = true;
    
Process pdfToImageProcess = new Process();
pdfToImageProcess.StartInfo = pdfToImageStartInfo;
pdfToImageProcess.Start();
pdfToImageProcess.WaitForExit();

在应用程序中嵌入PDF查看器控件: 如果要在应用程序中显示PDF内容,可以使用允许将PDF查看器直接嵌入应用程序用户界面的PDF查看器库或控件.这样,您就可以控制它在应用程序窗口中的可见性和位置.

提供PDF查看控件的库的示例:

Adobe PDF Reader控件(ActiveX):如果您安装了Adobe Acrobat Reader,则可以使用Adobe Acrobat Reader ActiveX控件. Pdf.js:用于在网页中呈现PDF的JavaScript库.您可以在应用程序中嵌入Web浏览器控件,以使用PDF.js显示PDF. 使用Win32 API进行窗口操作: 如果您必须使用现有的PDF查看器并希望操纵其窗口可见性,则可以使用Win32 API函数(如ShowWindow和SetWindowPos)来控制PDF查看器窗口的可见性和位置.这是一种更高级的方法,需要了解Win32 API和进程间通信.

以下是使用Win32 API隐藏窗口的示例:

using System;
using System.Diagnostics;
using System.Runtime.InteropServices;

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

    static void Main()
    {
        Process[] processes = Process.GetProcessesByName("YourPDFViewerProcessName");
        if (processes.Length > 0)
        {
            IntPtr hWnd = processes[0].MainWindowHandle;
            ShowWindow(hWnd, 0); // 0 hides the window
        }
    }
}

请记住将"YourPDFViewerProcessName"替换为要操作的PDF查看器进程的实际名称.

请记住,使用Win32 API操作外部进程窗口的可见性可能很复杂,并且可能不能与所有PDF查看器完美地配合使用.如果可能,使用PDF查看器控件或无头PDF工具通常更容易、更可靠.

Csharp相关问答推荐

MongoDB实体框架核心:表达必须可写

C#自定义字典与JSON(de—)serialize

编写DataAnnotations自定义验证器的多种方法

. NET在上一个操作完成之前,在此上下文实例上启动了第二个操作

Polly使用泛型重试和重试包装函数

如何注册接口类型,类型<>

与C#中的Zip列表并行

Azure Redis缓存与Entra ID身份验证

从依赖项容器在.NET 8中的Program.cs文件中添加IOC

在.NET核心项目中创建Startup.cs比在Program.cs中注册服务好吗?

未找到任何HTTP触发器.成功部署Azure Functions Project后(c#)

当索引和外键是不同的数据类型时,如何设置导航属性?

为什么方法的值在SELECT方法中不会更改?

在DoubleClick上交换DataGridViewImageColumn的图像和工具提示

在implementationFactory中避免循环依赖

我什么时候应该在Dapper中使用Connection.OpenAsync?

从HTML元素获取 colored颜色

在ObservableCollection上使用[NotifyPropertyChangedFor()]源代码生成器不会更新UI

在SQL中删除少于24小时的令牌

组件';EditForm';使用与包含子内容元素';授权';相同的参数名称(';上下文';)