2015-02-06 149 views
0

我有超过一千封电子邮件需要转换为单个PDF。我编写的代码能够处理人造打印作业,直到“将PDF另存为...”对话框。使用“print to pdf”选项打开文件对话框的“文件名”

我需要操纵该对话框中的文件名到原始文件名。我无法找到将字符串发布到对话框的文件名部分的方法,因为这是在单独的进程上发布的非传统方法。

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

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(); 
    } 
+0

由于很清楚你有能力编写代码,你可以自己创建一个你想要的库,然后调用这个库。模拟用户点击是不可靠和困难的。此代码类似于通过运行“calc.exe”并单击按钮来执行数学运算。 :-) – 2015-02-06 18:45:44

+0

这些是什么样的文件? – 2015-02-06 18:46:11

+0

我不知道是否有一个库可以做我想要的。我还没有找到一个可以安全地在办公室进行风险测试的人......我会继续寻找,但你的建议绝对是我认为会结束的地方。 这些文件是从Outlook .msg。它们不能以传统方式编译为PDF。 – SavvyK 2015-02-06 20:23:15

回答

0

你基本上都在问周围的黑客,这意味着没有安全的方法来做到这一点。可能的方式可以是这样的:

1)您枚举屏幕上显示windowses,通过EnumWindows

2)使用的每一个窗口GetWindowText找到您正在搜索的对话框的标题。

3)Ocassionaly可能有更多的一个对话框,Murphy's law总是存在,所以甚至可能是相同的标题。通过

3.A呼叫GetWindowLong可以降低碰撞风险与“对话”的HWND你发现

3.B呼叫GetParent得到父窗口的HWND,你已经知道

如果你能避免或者可能不关心的窗口样式&标题碰撞的情况下,就直接跳到了点(3)

4)一旦你找到了你的对话框,运行在其HWND EnumChildWindows得到它

5)所有控件找到contrlol你通过一些属性(通常为类标识码)

6)执行SetWindowtext设置你喜欢的文字感兴趣的内容。

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

  • 您可能碰巧在屏幕上有多个对话框在同一时刻

  • 您可以下载PDF处理器的新版本,并在另存为对话框中可能有一些变化,所以你的代码会中断。

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

一个很好的工具,可能是Windows上窗口调查的最佳工具,大概是Spy ++,它可以在Visual Studio安装中使用。使用它你可以尝试找到你想要放置文本的那个对话框文本框的一些独特属性。把它放在你的手中,你可以可靠地查询对话框的子集合来找到文本框。

+1

谢谢,Tigran。我没有与Spy ++混淆,但从它的声音来看,我可能在这里没有选择。我希望我不需要经过这么多的步骤,但我会尽我所能去做。 我会让你知道它是否适合我。 – SavvyK 2015-02-06 20:25:35

+0

标记为答案。这是(最终)让我接触到解决方案的。使用API​​和库不能为我提供期望的结果。 – SavvyK 2015-02-17 17:45:47

0

在您提到.msg之后,我做了一个.msg文件格式的Google搜索,我很惊讶地发现它是有据可查的。这是一个OLESS文件,并且有用于加载这些文件的API。我甚至发现了一个能够加载我刚从Outlook 2013保存的电子邮件的C#示例CodeProject

这将是一个有点工作,因为你将不得不编写代码来“渲染”消息你是否觉得合适。例如:它给你身体,收件人和附件。你将不得不决定如何处理附件和代码。然后找到一个PDF库。但至少它是一个程序化的解决方案,而不是依靠黑客攻击UI。

另外:谷歌搜索.MSG到PDF返回负载的工具来做到这一点。一个是论坛帖子,指的是Adobe产品,称为“Acrobat PDFMaker”,所以也许你甚至不需要编写代码。

+0

我正在查看CodeProject作品...... – SavvyK 2015-02-06 21:04:47

0

对不起,发布2则解答。我有解决文件提示的确切问题。这些说明会稍有基于Windows版本,但你会得到的想法:

  1. 添加使用PDF打印机驱动程序
  2. 当它要求对“端口”一个新的打印机点击“添加端口”,然后“本地端口”
  3. 输入文件名。例如:“C:\ Users \ Myself \ MyPdf.pdf”
  4. 照常完成打印向导。

我与XPS打印机测试这和它的工作

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