0

这是我正在尝试做的事情:

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

  1. 劫持 WndProc 以回答 WM_ACTIVATE 消息
  2. 如果窗口标题是“Brother PC-FAX”,那么
  3. 使用 SendKeys.Send() 发送“+{TAB}”、“^V”和“%O”

这将起作用,除非实际传真对话框似乎没有注册为实际窗口,例如,它可能只是打印驱动程序的对话框子窗体。我想出的唯一窗口标题是“打印”框,这是在任何打印机上每次打印时都会弹出的小窗口。这不允许 SendKeys 函数通过。

关于我应该如何处理这个问题的任何想法?如果驱动程序具有允许自定义命令调用的 SDK,那就太好了,但事实并非如此。

4

1 回答 1

1

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

  1. 在打印操作中,将剪贴板文本设置为传真号码
  2. 创建后台工作者来处理打印
  3. 启动后台打印作业后,让当前线程休眠 5 秒,让传真对话有时间到达前面和中心
  4. 对“+{TAB}”和“^V”命令使用 SendKeys.SendWait 命令,然后对最终的“%O”命令使用 SendKeys.Send

这行得通,但是如果系统性能下降导致打印作业变慢,超过 5 秒的睡眠周期,我可以看到问题。这个周期可以增加,但也许还有更好的方法?

于 2012-10-12T15:38:05.117 回答