Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 控制外部对话框_C#_Winforms_Printing - Fatal编程技术网

C# 控制外部对话框

C# 控制外部对话框,c#,winforms,printing,C#,Winforms,Printing,以下是我想做的: 我的应用程序有一个功能,允许传真生成的文档。此功能将文档打印到系统中设置为传真打印机的打印机上。它是一个兄弟,打印机名称是Brother PC-FAX。当前,启动打印作业时,打印驱动程序会打开一个对话框,用于输入传真号码、封面选项等。将存储与文档关联的传真号码。我正在尝试设置我的应用程序,为用户输入传真号码,然后单击“开始”按钮。 该对话框有快捷方式,它最初聚焦于一个按钮,用户可以按Shift+TAB键进入数字输入控件,然后接受Ctrl+V进行粘贴。然后用户可以按Alt+O激活

以下是我想做的:

我的应用程序有一个功能,允许传真生成的文档。此功能将文档打印到系统中设置为传真打印机的打印机上。它是一个兄弟,打印机名称是Brother PC-FAX。当前,启动打印作业时,打印驱动程序会打开一个对话框,用于输入传真号码、封面选项等。将存储与文档关联的传真号码。我正在尝试设置我的应用程序,为用户输入传真号码,然后单击“开始”按钮。 该对话框有快捷方式,它最初聚焦于一个按钮,用户可以按Shift+TAB键进入数字输入控件,然后接受Ctrl+V进行粘贴。然后用户可以按Alt+O激活“开始”按钮。我以前的应用程序版本只是将传真号码复制到剪贴板,并将粘贴和单击操作留给用户,但我正在尝试进一步自动化。我目前的做法是

  • 劫持WndProc以回答WM_激活消息
  • 如果窗口标题为“Brother PC-FAX”,则
  • 使用SendKeys.Send()发送“+{TAB}”、“^V”和“%O”
  • 这将起作用,除非实际的传真对话框似乎没有注册为实际窗口,例如,它可能只是打印驱动程序的对话框子窗体。我想到的唯一窗口标题是“打印”框,它是每次在任何打印机上打印时弹出的小窗口。这不允许SendKeys功能通过


    我该怎么处理这件事呢?如果驱动程序有和SDK可以允许自定义命令调用,那就太好了,但它没有。

    找到了,至少我找到了“A”方法。如果有人有更好或更有效的想法,请告诉我,但我是如何解决的:

  • 在打印操作中,将剪贴板文本设置为传真号码
  • 创建后台工作程序以处理打印
  • 启动后台打印作业后,将当前线程休眠5秒钟,让传真对话框有时间到达前端和中心
  • 对“+{TAB}”和“^V”命令使用SendKeys.SendWait命令,然后只使用SendKeys.Send命令获取最后的“%O”命令
  • 这是可行的,但如果系统性能下降导致打印作业速度减慢,超过5秒的睡眠周期,我可以看到问题。这个周期可以延长,但也许还有更好的方法