使用 "print to pdf" 选项操作打开的文件对话框的 "filename"

Manipulating "filename" of file dialog opened using a "print to pdf" option

我有超过一千封电子邮件需要转换为单独的 PDF。我编写的代码能够处理 "Save PDF As..." 对话框中的伪打印作业。

我需要将该对话框中的文件名修改为原始文件名。我找不到将字符串 post 添加到对话框的文件名部分的方法,因为这是一种非常规方法 post 在单独的进程中。

如何将此信息发送到与应用程序调用的进程无关的活动对话框 window?

    public static void Main(string[] args)
    {
        string folderIn = Path.GetDirectoryName(@"Z:\Files up to 3-6-13\");
        string folderOut = Path.GetDirectoryName(@"c:\users\athomas\desktop\Output");

        string[] fileList = Directory.GetFiles(folderIn);

        foreach(var fileName in fileList)
        {
            Console.WriteLine(fileName);

            Process p = new Process();
            ProcessStartInfo info = new ProcessStartInfo(fileName);
            info.Verb = "Print";
            info.CreateNoWindow = true;
            info.WindowStyle = ProcessWindowStyle.Hidden;
            Process.Start(info);

            //  This is where I need to say something like
            //  SaveDialog.SaveAs(fileName.SafeFileName) 

            if(p.HasExited == false)
            {
                p.WaitForExit(1000);
            }


        }

        Console.ReadLine();
    }

你基本上是在问关于黑客攻击的问题,这意味着没有安全的方法可以做到这一点。可能的方式可能是这样的:

1) 您通过 EnumWindows

枚举了屏幕上显示的 windowses

2) 您使用每个 window GetWindowText 来查找您正在搜索的对话框的标题。

3) 有时可能会有不止一个对话框,Murphy's law 总是在那里,所以甚至可能有相同的标题。您可以 将碰撞风险降低

3.a 使用您找到

的 "dialog" 的 HWND 调用 GetWindowLong

3.b调用GetParent获取parentwindow的HWND,你已经知道

如果你能避免或可能不关心 window 样式和标题冲突的情况,请跳过第 (3) 点

4) 找到对话框后,运行 在其 HWND EnumChildWindows 上获得对它的所有控制

5) 通过一些属性找到你感兴趣的控件(通常是Class_ID)

6) 执行SetWindowtext设置你喜欢的文字。

正如我之前所说,这个过程有几个地方可能会失败。 例如:

  • 您可能恰好同时在屏幕上显示多个对话框

  • 您可以下载新版本的 PDF 处理器,并且在“另存为”对话框中可能有一些更改,因此您的代码会出错。

但考虑到你是黑客,你可能会承担自己的风险。

一个优秀的工具,可能是最好的工具,用于 Windows 的 window 调查,可能是 Spy ++,它在 visual studio 安装中可用。使用它,您可以尝试找到要在其中放置文本的对话框的文本框的一些独特属性。有了它,您就可以可靠地查询对话框的 children collection 来找到文本框。

在你提到 .msg 之后,我对 .msg 文件格式进行了 Google 搜索,我惊讶地发现它有很好的文档记录。它是一个 OLESS 文件,并且有用于加载这些文件的 API。我什至找到了一个 CodeProject C# 示例,它能够加载我刚刚从 Outlook 2013 保存的电子邮件!

这会有些工作量,因为您必须编写代码以 "render" 发送您认为合适的消息。例如:它为您提供正文、收件人和附件。您必须决定如何处理附件并将其编码。然后找个PDF库。但至少它是一个程序化的解决方案,而不是依赖于破解 UI.

另外:Google 对 .MSG 到 PDF 的搜索返回了大量工具来执行此操作。一个是论坛 post,它引用了一个名为 "Acrobat PDFMaker" 的 Adob​​e 产品,所以也许您甚至不需要编写代码。

抱歉 post 2 个答案。我有一个解决提示输入文件的确切问题的方法。这些说明根据 Windows 的版本略有不同,但您会明白:

  1. 添加使用 PDF 打印机驱动程序的新打印机
  2. 当它要求 "port" 点击 "Add Port" 然后 "Local Port"
  3. 输入文件名。例如:"C:\Users\Myself\MyPdf.pdf"
  4. 照常完成打印向导。

我用 XPS 打印机测试了它,它工作正常

当您打印到这台打印机时,它会写入那个确切的文件:没有提示!您将必须监视文件(我建议使用 FileSystemWatcher)或轮询文件何时关闭或类似的东西。之后,您可以将文件移动到其他地方。