我有超过一千封需要转换为单独PDF的电子邮件。我编写的代码能够处理虚假打印作业,直到"将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 :(得分:0)
你基本上都在询问黑客攻击,这意味着没有安全的方法可以做到这一点。可能的方式可能如下所示:
1)您可以通过EnumWindows
枚举屏幕上显示的窗口2)您可以使用每个窗口GetWindowText来查找您要搜索的对话框的标题。
3)Ocassionaly可能会有多个对话框,Murphy's law始终存在,所以甚至可能具有相同的标题。您可以通过
降低碰撞风险3.a使用您找到的“对话框”的HWND调用GetWindowLong
3.b调用GetParent获取父窗口的HWND,您已经知道
如果您可以避免或不关心窗口样式和标题碰撞的情况,只需跳过点(3)
4)找到对话框后,运行其HWND EnumChildWindows以获取其所有控件
5)通过一些属性(通常是Class_ID)找到你感兴趣的控制器
6)执行SetWindowtext设置您喜欢的文字。
正如我之前所说,这个过程有几个地方可能会失败。 例如:
您可能在同一时刻在屏幕上碰巧有多个对话框
您可以下载新版本的PDF处理器,在SaveAs对话框中可能会有更改,因此您的代码将会中断。
但考虑到你是黑客,你可能会冒自己的风险。
一个优秀的工具,可能是Windows上窗口调查的最佳工具,可能是Spy ++,可在Visual Studio安装中使用。使用它,您可以尝试找到该对话框的文本框的一些独特属性,您可以在其中放入文本。掌握了这些属性,您可以可靠地查询对话框的子集合以查找文本框。
答案 1 :(得分:0)
在您提到.msg之后,我使用.msg文件格式进行了Google搜索,我很惊讶地发现它有详细记录。它是一个OLESS文件,并且有用于加载它们的API。我甚至找到了一个CodeProject C#示例,它能够加载我刚从Outlook 2013保存的电子邮件!
这将是一项工作,因为你必须编写代码来“渲染”你认为合适的消息。例如:它为您提供身体,接收者和附件。您必须决定如何处理附件和代码。然后找一个PDF库。但至少它是一个程序化的解决方案,而不是依赖于黑客用户界面。
此外:谷歌搜索.MSG到PDF返回了大量工具来执行此操作。一个是一个论坛帖子,指的是一个名为“Acrobat PDFMaker”的Adobe产品,所以你甚至可能不需要编写代码。
答案 2 :(得分:0)
很抱歉发布2个回答。我有一个解决方案提醒文件的确切问题。这些说明根据Windows的版本略有不同,但您会明白这一点:
我使用XPS打印机进行了测试,并且可以正常使用
当您打印到此打印机时,它会写入该确切文件:没有提示!您必须监视文件(我建议使用FileSystemWatcher)或轮询文件何时关闭或类似的内容。之后,您可以将文件移动到其他位置。