如何强制进程隐形启动?

问题描述 投票:0回答:2

我想将 PDF 查看器作为不可见进程启动,将其强制放入控件中,然后再次显示。但观众似乎拒绝开始隐形。我已经尝试过这些启动参数:

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

我可以做些什么来强制查看器启动隐形(也许是 Win32 API)?

c# winforms winapi process controls
2个回答
0
投票

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

使用无头 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 工具通常更容易、更可靠。


0
投票

Adobe acrobat reader 有一个用于“隐藏”的启动开关 /h,但出于必要,空白渲染需要一个图标,以便用户或其应用程序/pdf 可以访问。

"C:\Program Files\Adobe\Acrobat Reader DC\Reader\AcroRd32.exe" /n /h

为什么最小化而不是真正隐藏?,Adobe员工在论坛中描述为:-

许多批量和无头操作不符合 EULA。

© www.soinside.com 2019 - 2024. All rights reserved.