Перейти к содержимому

Фотография

Принтер по умолчанию


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 8

#1 nastya.e

nastya.e

    Новый участник

  • Members
  • Pip
  • 19 сообщений
  • ФИО:Анастасия

Отправлено 16 июля 2014 - 09:23

Всем здравствуйте.

Возможно ли изменить автоматически из теста  принтер по умолчанию?И как это можно реализовать


  • 0

#2 modbear

modbear

    Специалист

  • Members
  • PipPipPipPipPip
  • 548 сообщений

Отправлено 16 июля 2014 - 10:44

Можно, с помощью WMI класса Win32_Printer:

// JScript
function SetDefaultPrinter()
{
  var strPrinterName = "Adobe PDF"; // Имя принтера в Devices & Printers

  var oWMI = GetObject("winmgmts:root/cimv2");
  try {
    var res = oWMI.Get("Win32_Printer.DeviceID='" + strPrinterName + "'").SetDefaultPrinter();
    if (res != 0)
    {
      Log.Error(aqString.Format("Could not set the default printer. Error %d: %s", res, aqUtils.SysErrorMessage(res)));
    }
  }
  catch (e)
  {
    Log.Error(aqString.Format("Error %#x: %s", e.number, e.message));
  }
}

  • 0

#3 nastya.e

nastya.e

    Новый участник

  • Members
  • Pip
  • 19 сообщений
  • ФИО:Анастасия

Отправлено 17 июля 2014 - 05:25

modbear, спасибо большое за совет.
 
На основании вашего кода  написала для DelphiScript, возможно кому-то ещё пригодится, поэтому оставлю здесь.

function SetDefaultPrinter;
var Locator, WmiService, Res, PrinterName;
begin
  Locator: = Sys.OleObject ('WbemScripting.SWbemLocator');
  WmiService: = Locator.ConnectServer ('.', 'root\cimv2', '', '');
  PrinterName := 'Microsoft XPS Document Writer'; // Имя принтера в Devices & Printers
  
  try
    begin
      Res := WmiService.Get('Win32_Printer.DeviceID='+#39+'' + PrinterName + ''+#39+'').SetDefaultPrinter;
      result := True;
      if Res <> 0 then
        begin
          Log.Error(aqString.Format('Could not set the default printer', Res, aqUtils.SysErrorMessage(Res)));
          result := False;
        end;
    end;
  except
    begin
      Log.Error(aqString.Format('Error ', ExceptionMessage));
      result := False;
    end;
  end;
end;

  • 1

#4 nastya.e

nastya.e

    Новый участник

  • Members
  • Pip
  • 19 сообщений
  • ФИО:Анастасия

Отправлено 18 июля 2014 - 03:34

 

Можно, с помощью WMI класса Win32_Printer:





// JScript
function SetDefaultPrinter()
{
  var strPrinterName = "Adobe PDF"; // Имя принтера в Devices & Printers

  var oWMI = GetObject("winmgmts:root/cimv2");
  try {
    var res = oWMI.Get("Win32_Printer.DeviceID='" + strPrinterName + "'").SetDefaultPrinter();
    if (res != 0)
    {
      Log.Error(aqString.Format("Could not set the default printer. Error %d: %s", res, aqUtils.SysErrorMessage(res)));
    }
  }
  catch (e)
  {
    Log.Error(aqString.Format("Error %#x: %s", e.number, e.message));
  }
}

 

modbear, возможно вы знаете как используя DelphiScript определить принтер, который используется по умолчанию.



function GetDefaultPrinter;
var Locator, WmiService, PrinterName, objPrinter, WbemObject;
begin
  Locator: = Sys.OleObject ('WbemScripting.SWbemLocator');
  WmiService: = Locator.ConnectServer ('.', 'root\cimv2', '', '');

  objPrinter   := WMIService.Get('Win32_Printer.Default=True'); //если использовать эту строку, то в логе ошибка SWbemServicesEx

 //если получать принтер запросом:
 WbemObject := WmiService.ExecQuery('Select * from Win32_Printer Where Default = True');
//то я не знаю, как получить результат запроса, чтобы затем определить имя принтера.

в примерах http://msdn.microsof...8(v=vs.85).aspx есть код, как определить принтер по умолчанию, но у меня не получается изменить его под DelphiScript


  • 0

#5 modbear

modbear

    Специалист

  • Members
  • PipPipPipPipPip
  • 548 сообщений

Отправлено 18 июля 2014 - 06:49

У вас почти получилось. Надо по результатам ExecQuery пройтись enumerator'ом:

function GetDefaultPrinter;
var Locator, WmiService, PrinterName, objPrinter, colPrinters, enumPrinters;
begin
  Locator: = Sys.OleObject ('WbemScripting.SWbemLocator');
  WmiService: = Locator.ConnectServer ('.', 'root\cimv2', '', '');

  colPrinters := WmiService.ExecQuery('Select * from Win32_Printer Where Default = True');
  enumPrinters := Enumerator(colPrinters);
  while not enumPrinters.AtEnd do
  begin
    objPrinter := enumPrinters.Item;
    Log.Message(objPrinter.Name);
    enumPrinters.MoveNext;
  end;
end;

  • 0

#6 nastya.e

nastya.e

    Новый участник

  • Members
  • Pip
  • 19 сообщений
  • ФИО:Анастасия

Отправлено 18 июля 2014 - 08:15

 

У вас почти получилось. Надо по результатам ExecQuery пройтись enumerator'ом:





function GetDefaultPrinter;
var Locator, WmiService, PrinterName, objPrinter, colPrinters, enumPrinters;
begin
  Locator: = Sys.OleObject ('WbemScripting.SWbemLocator');
  WmiService: = Locator.ConnectServer ('.', 'root\cimv2', '', '');

  colPrinters := WmiService.ExecQuery('Select * from Win32_Printer Where Default = True');
  enumPrinters := Enumerator(colPrinters);
  while not enumPrinters.AtEnd do
  begin
    objPrinter := enumPrinters.Item;
    Log.Message(objPrinter.Name);
    enumPrinters.MoveNext;
  end;
end;

 

 

у меня после выполнения теста в лог ничего не падает, тест просто проходит как успешный.

результат у запроса Select * from Win32_Printer Where Default = True  есть, т.к. если в коде прописать

if colPrinters.Count>0 then Log.Message('Установлен принтер по умолчанию'), то в  лог попадает сообщение.


  • 0

#7 modbear

modbear

    Специалист

  • Members
  • PipPipPipPipPip
  • 548 сообщений

Отправлено 18 июля 2014 - 08:44

Странно. А попробуйте так (это тот же самый ExecQuery, только через командную строку):

function GetDefaultPrinter;
var oShell, oExec, str, strPrinterName;
begin
  oShell := Sys.OleObject['WScript.Shell'];
  oExec := oShell.Exec('wmic printer where default="true" get name /value');
  str := oExec.StdOut.ReadAll;
  // wmic ... get ... /value returns a string in the format "Name=PrinterName".

  // Remove blank lines at the beginning and end
  str := aqString.Trim(str, aqString.stAll);

  // Get just the value
  aqString.ListSeparator := '=';
  strPrinterName := aqString.GetListItem(str, 1);

  Log.Message(strPrinterName);
end;

  • 0

#8 nastya.e

nastya.e

    Новый участник

  • Members
  • Pip
  • 19 сообщений
  • ФИО:Анастасия

Отправлено 18 июля 2014 - 08:59

этот вариант через командную строку  работает, спасибо за помощь :smile:  


  • 0

#9 Alonyde

Alonyde

    Новый участник

  • Members
  • Pip
  • 2 сообщений
  • ФИО:Саша

Отправлено 04 октября 2016 - 18:14

А наша контора особо не парилась, мы просто берем и тут  заказываем полный сервис по принтерам и переферии, у нас все таки другое направление и тратить внутренние ресурсы не очень сподручно


  • 0


Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных