вторник, 7 апреля 2015 г.

Эмулятор ксерокса (сканера и принтера). Расширенная версия

Данная библиотека (далее DLL), для работы со сканером (по-умолчанию) через драйвер универсального TWAIN-интерфейса в ОС NT/2000/2003/XP/7/8, предназначена для осуществления быстрого сканирования без всяческих диалогов и подтверждений с отправкой на печать полученного изображения и параллельным архивированием всех сканов в формате BMP или JPEG. Предпосылкой разработки стала необходимость автоматизации сканирования и печати нажатием одной кнопки на сканере (родное ПО не поддерживает), вследствие разнесенных территориально сканера и принтера, дабы не бегать туда-сюда. Своего рода программная эмуляция ксерокса. Отслеживание запускаемого родными драйверами процесса по нажатию кнопки на сканере осуществляет batch-файл 'ra_scan_process.bat'. Данный батник сканирует постоянно список процессов на заданный пользователем и при обнаружении оного закрывает его, после чего запускает скрипт 'runscanprint.vbs' для вызова библиотеки работы со сканером и принтером.



DLL предоставляет универсальный доступ для других приложений вне зависимости от языка в среде Win32/64. Для использования DLL в своих проектах соблюдайте соглашение об stdcall-вызовах. Тип соглашения о вызове объявляется после прототипа функции, будь то объявление функционального типа или же объявление функции.

Таблица расшифровок параметров экспортируемой функции ScanAndPrint() библиотеки 'ra_scan_print.DLL':
Параметр    Функционал                      Тип переменной
=========================================
scan            разрешение сканирования   DWord
prints          разрешение печати             DWord
bmpjpg       архивирование в BMP/JPG DWord
resolution    разрешение сканирования   DWord
result          разработчик                      PAnsiChar
Пример динамического подключения (Delphi 6/7/2006/2009/2010/TDL/XE5-7):
var

     scanandprint:function(scan,         // флаг сканирования
                  prints,                       // флаг печати
                  bmpjpg,                    // флаг архивирования в BMP/JPEG
                  resolution:                 // разрешение pix/"
                  dword): pansichar; stdcall;
                       
     LibHandle: THandle;

function LinkProc(ProcName: string):Pointer;
begin
 GetProcAddress(LibHandle, PChar(ProcName))
end;

{ инициализация }
begin
 LibHandle:= LoadLibrary('ra_scan_print.dll');
 key:= LinkProc('scanandprint')
end;

{ пример вызова }
begin
 result:= scanandprint(1, 1, 0, 300);
Пример использования через dynwrapX.dll в VBS:
Set Wrap = CreateObject("DynamicWrapperX")
Wrap.Register "ra_scan_print.dll", "scanandprint", "i=llll", "f=s", "r=l"
res = Wrap.scanandprint(1, 1, 0, 300)
Пример использования в Excel (макроса в VBA):
Declare Function scanandprint Lib "ra_scan_print.dll" (ByVal scan As Integer, ByVal prints As Integer, ByVal bmpjpg As Integer, ByVal resolution As Integer) As long

Sub TestMacros()
 scanandprint(1, 1, 0, 300)
End Sub

// или по кнопке

Private Sub Command1_Click()
 scanandprint(1, 1, 0, 300)
End Sub
Пример использования в VB:
Declare Function scanandprint Lib "ra_scan_print.dll" (ByVal scan As Integer, ByVal prints As Integer, ByVal bmpjpg As Integer, ByVal resolution As Integer) As long

Private Sub Command1_Click()
 scanandprint(0, 1, 0, 300)
End Sub
Батничек отслеживания процессов и автозапуска сканирования:
REM ra_scan_process
REM Дополнение к "The API library call RA_SCAN_PRINT.DLL"
REM Батник постоянной проверки на наличие заданного процесса,
REM его завершения и запуска сканирования документа через runscanprint.vbs
REM Не забудьте поменять 'ProcessName' на имя программы,
REM которая запускается у вас при нажатии кнопки сканирования ('calc' для примера)
REM Разработчик: Бадло Сергей Григорьевич
REM H-page: http://raxp.radioliga.com
REM Ограничения: winxp&up / not xp home

set ProcessName="calc.exe"
:m1
cls
TaskList /FI "ImageName EQ %ProcessName%" | Find /I %ProcessName%>nul||(
ping 0 -n 3
goto m1
)
taskkill /f /im %ProcessName%
REM своего рода задержка на 2 минус 1 секунды через пинг
ping 0 -n 2
start runscanprint
goto m1
VBS-скрипт отслеживания процессов и автозапуска сканирования:
closewindow="Заголовок окна"

' регистрируем COM объект DynamicWrapperX в тихом режиме
Dim WshShell
Set WshShell = WScript.CreateObject("WScript.Shell")
WshShell.Run ("regsvr32.exe dynwrapx.dll /s"),3, true
' создаем объект DynamicWrapperX
Set Wrap = CreateObject("DynamicWrapperX.2")
GPTR = 64

' регистрируем вызовы WinAPI- функций для работы с окнами
DWX.Register "user32",   "EnumWindows",    "i=pl"
DWX.Register "user32",   "GetWindowTextW", "i=hpl"
DWX.Register "kernel32", "GlobalAlloc",    "i=uu", "r=p"
DWX.Register "kernel32", "GlobalFree",     "i=p"
' регистрируем вызов для нашей библиотеки
DWX.Register "ra_scan_print.dll", "scanandprint", "i=llll", "f=s", "r=l"

' Получение ссылки на функцию
Set Ref = GetRef("CbkEnumWin") 
' регистрация callback- функции
pCbkFunc = DWX.RegisterCallback(Ref, "i=hl", "r=l") 
                                                   
Do ' бесконечный цикл
pBuffer = DWX.GlobalAlloc(GPTR, 512)
' Вызов EnumWindows с передачей указателя
' на callback- функцию
DWX.EnumWindows pCbkFunc, 0   
' подчищаем
DWX.GlobalFree pBuffer
' задержка на 1000 мс
wscript.sleep 1000
Loop

' callback- функция
Function CbkEnumWin(hwnd, lparam)

 ' получаем текст заголовка окна
 DWX.GetWindowTextW hwnd, pBuffer, 256
 ' Чтение строки из буфера
 Title = DWX.StrGet(pBuffer)
 ' если не нулевая длина и наше окно, то
 If (Len(Title) > 0)and(Title = closewindow) Then

    ' активировать окно и...
    WshShell.AppActivate (Title) , true
    wscript.sleep 100
    ' закрыть
    WshShell.SendKeys "(%{F4})"
    WScript.Sleep 200
    WshShell.AppActivate ("loop"), true

    ' запуск сканирования и печати
    DWX.scanandprint(1, 1, 0, 300)

  End If
  CbkEnumWin = 1         

End Function
ПОРЯДОК ИСПОЛЬЗОВАНИЯ И ОГРАНИЧЕНИЯ
  1. Библиотека 'RA_SCAN_PRINT.DLL' распространяется по лицензии Beerware.
  2. Обеспечивает сканирование при наличии универсального TWAIN-драйвера с выбранного сканнера по-умолчанию.
  3. Параметр вызова 'print' будет игнорироваться при пустом параметре 'scan' (поскольку печать пустоты бессмысленна)
  4. Для вызова библиотеки 'ra_scan_print.dll' без программирования по горячей клавише(ш) средствами COM-сервера 'dynwrapx.dll' вынесите ярлык на рабочий стол, укажите скрипт и назначьте "горячую комбинацию клавиш".
cкачать

p.s.:  выпущена надстройка (WEB-сервер) над библиотекой, позволяющая контролировать процесс сканирования и печати прямо из вашего браузера.

1 комментарий:

  1. Выпущено обновление библиотеки 'ra_scan_print.dll' ver.1.4. Проект на SourceForge https://sourceforge.net/projects/rascanprint/files/latest/download

    ОтветитьУдалить

В комментариях уважайте собеседника, внимательно читайте посты и не додумывайте. Просьбы и предложения из разряда: «можно ваш Skype/Viber/телефон», «напишите мне в vk/FB», а также другие им подобные — игнорируются. Выход новых версий ПО, внешняя ссылка, переставшая работать с течением времени и т.п. не является основанием для претензий. Желающие спокойно подискутировать и высказаться — Welcome. Желающие спонсировать блог — Donate. Нарушение этих простых правил ведет к бану и удалению комментариев без предупреждения.