0

これが私がやろうとしていることです:

私のアプリケーションには、生成されたドキュメントをファックスできる機能があります。この機能は、システムで FAX プリンターとして設定されているプリンターにドキュメントを印刷します。ブラザー製で、プリンター名はブラザーPC-FAXです。現在、印刷ジョブが開始されると、プリンター ドライバーは、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 に答える