Как использовать C # для автоматизации связок заданий на печать? - PullRequest
0 голосов
/ 21 октября 2011

Я разрабатываю инструмент автоматизации, который считывает путь к файлу из книги Excel, и после запуска приложения запускаю задание на печать, используя SendKeys.SendWait() для Ctrl+P и Enter key. Теперь проблема в том, что я столкнулся с проблемой синхронизации для запуска приложения и обработки ключей процедуры печати. Иногда приложения запускаются с небольшим опозданием (например, файлы Excel и MsWord), поэтому в настоящее время я не могу определить, как долго мне придется ждать успешного запуска приложения. У кого-нибудь есть идея, как проверить это время ожидания до того, как долго я должен ждать стрельбы CTRL+P, а затем после получения кнопки PrintDialog ENTER?

Любая помощь будет признательна. Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 24 октября 2011

Я изначально прочитал вопрос только как печать файлов типа MS.Если вы хотите распечатать все виды файлов, я бы сначала использовал функцию Windows «PrintTo».

Вы можете вызывать команды напрямую, выполнив поиск в реестре для PrintTo, и вы должны увидеть команды для PrintTo, а также Print.Хит в Интернете для специфики для каждого приложения.

Другой вариант, который, вероятно, является самым простым, - это использовать глагол PrintTo с ShellExecute и позволить Windows обрабатывать закулисные действия.

System.Diagnostics.Process print = new System.Diagnostics.Process();
print.StartInfo.FileName = @"c:\test\test.pdf";
print.StartInfo.Verb = "PrintTo";
print.StartInfo.CreateNoWindow = True;
print.StartInfo.Arguments = printerName;
print.StartInfo.UseShellExecute = True;
print.Start();
print.WaitForExit();

PrintTo должен позволять вам указывать принтер, аГлагол «Печать» следует просто отправить на устройство по умолчанию.

Имейте в виду, что не все типы файлов поддерживают эти глаголы.

0 голосов
/ 25 октября 2011

Чтобы определить, готово или нет приложение для автоматизации принимать пользовательский ввод (нажатия клавиш), вам необходимо найти окно приложения, обрабатывающее нажатия клавиш, которые вы отправите. Для выполнения этой задачи требуется немного взаимодействия. Ниже вы найдете небольшой пример автоматизации задачи печати документа Excel (все детали обработки ошибок опущены). Я скопировал подписи взаимодействия с pinvoke.net .

Сначала позвольте мне описать необходимые шаги:

  1. Поиск главного окна Excel по имени класса главного окна Excel. Используйте такой инструмент, как spy ++, чтобы определить имя класса.
  2. Выведите главное окно Excel на передний план.
  3. Отправьте CTRL + C в главное окно, чтобы открыть диалоговое окно печати. ​​
  4. Дождитесь появления диалогового окна печати. ​​
  5. Отправьте ENTER в диалоговое окно печати. ​​

Во-вторых, позвольте мне показать небольшой пример кода:

private enum WindowShowStyle : uint    
{     
  Hide = 0,
  ShowNormal = 1,
  ShowMinimized = 2,
  ShowMaximized = 3,
  Maximize = 3,
  ShowNormalNoActivate = 4,
  Show = 5,
  Minimize = 6,
  ShowMinNoActivate = 7,
  ShowNoActivate = 8,
  Restore = 9,
  ShowDefault = 10,
  ForceMinimized = 11
}

[DllImport("user32.dll", SetLastError = true)]
private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

[DllImport("user32.dll")]
private static extern bool ShowWindow(IntPtr hWnd, WindowShowStyle nCmdShow);

[DllImport("user32.dll")]
private static extern bool BringWindowToTop(IntPtr hWnd);

[DllImport("kernel32.dll")]
private static extern uint GetCurrentThreadId();

[DllImport("user32.dll")]
private static extern bool AttachThreadInput(uint idAttach, uint idAttachTo, bool fAttach);

[DllImport("user32.dll")]
private static extern IntPtr GetForegroundWindow();       

[DllImport("user32.dll", SetLastError = true)]
private static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId);

private static void BringWindowToForeground(IntPtr hWnd)
{
  uint foregroundThread, currentThread;

  uint pid;
  foregroundThread = GetWindowThreadProcessId(GetForegroundWindow(), out pid);
  currentThread    = GetCurrentThreadId();

  if (foregroundThread != currentThread)
  {
    AttachThreadInput(foregroundThread, currentThread, true);

    BringWindowToTop(hWnd);
    ShowWindow(hWnd, WindowShowStyle.ShowMaximized);                
    AttachThreadInput(foregroundThread, currentThread, false);
  }
  else
  {
    BringWindowToTop(hWnd);
    ShowWindow(hWnd, WindowShowStyle.ShowMaximized);
  }
}

private void button1_Click(object sender, EventArgs e)
{
   // Find excel window.
   IntPtr hWnd;
   while (true) 
   {
     hWnd = FindWindow("XLMAIN", null); // XLMAIN is the class name
                                        // of the main excel window.
     if (hWnd != IntPtr.Zero)
       break;
   }

   BringWindowToForeground(hWnd);
   SendKeys.SendWait("^p"); // Send CTRL+P to main excel window

   // Find print dialog.
   while (true)
   {
     hWnd = FindWindow("bosa_sdm_XL9", null); // bosa_sdm_XL9 is the class name
                                              // of the print dialog.
     if (hWnd != IntPtr.Zero)
       break;
   }

   BringWindowToForeground(hWnd);

   SendKeys.SendWait("~"); // Send ENTER to print dialog.
 }

Методы button_click включают в себя этапы ожидания появления окон Excel. Если указанное окно найдено, ключи отправляются.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...