我有一台相当老款的佳能扫描仪 Pixma MP 110。当然,佳能不提供任何有用的驱动程序(他们的网站真的很令人失望,完全令人沮丧和无用)——我找到的唯一软件是一个到处都是问号的中文版。
然而,如果我去设备和打印机在 Windows 下打开管理器并右键单击扫描仪,我可能会使用以我的母语编写的 Windows 集成扫描管理器。它的功能有些有限,但仍然比一堆充满问号的按钮要好。
我搜索了一下,发现我谈论的功能叫做威亚。
但是这是用捷克语表示的方法,对您来说可能听起来就像我听到的这些问号一样。
选择后开始扫描出现一个对话框。它在 下运行explorer.exe
,因此无法确定它实际上是什么程序。
我想要的是创建一个桌面快捷方式,这样自动开始扫描,无需我点击“开始扫描“ 和 ”扫描“。
此外,扫描仪有一个按钮可以开始扫描,我的电脑可以识别按下按钮的时间。当我按下按钮时,Windows 会询问我应该为该按钮运行什么应用程序——但是,这里没有扫描仪软件可以工作,Windows 给我的选项中也没有出现任何扫描仪软件。我想知道我是否可以破解它来运行该按钮的任何应用程序.(如果我能得到主要问题的答案,那将会很有用)。
如果你懒得读那篇长文的话,我再问你一遍:
- 如何让 Windows 使用批处理脚本或
.lnk
文件中的简单命令自动从已安装的扫描仪开始扫描? - (可选)如何将任何应用程序分配给扫描仪的按钮按下?
答案1
PowerShell 解决方案
该脚本应该适用于大多数扫描仪,无论是佳能、爱普生还是其他品牌,只要它们兼容 WIA 并支持该transfer()
命令即可。脚本将立即开始扫描。所有选项(如文件名、路径或图像格式)都已通过脚本设置。您只需使用快捷方式启动扫描过程
- 另存为例如
D:\StartScan.ps1
创建新的快捷方式并将其指向
%SystemRoot%\system32\WindowsPowerShell\v1.0\powershell.exe -File "D:\StartScan.ps1"
开始扫描
# Create object to access the scanner
$deviceManager = new-object -ComObject WIA.DeviceManager
$device = $deviceManager.DeviceInfos.Item(1).Connect()
# Create object to access the scanned image later
$imageProcess = new-object -ComObject WIA.ImageProcess
# Store file format GUID strings
$wiaFormatBMP = "{B96B3CAB-0728-11D3-9D7B-0000F81EF32E}"
$wiaFormatPNG = "{B96B3CAF-0728-11D3-9D7B-0000F81EF32E}"
$wiaFormatGIF = "{B96B3CB0-0728-11D3-9D7B-0000F81EF32E}"
$wiaFormatJPEG = "{B96B3CAE-0728-11D3-9D7B-0000F81EF32E}"
$wiaFormatTIFF = "{B96B3CB1-0728-11D3-9D7B-0000F81EF32E}"
# Scan the image from scanner as BMP
foreach ($item in $device.Items) {
$image = $item.Transfer()
}
# set type to JPEG and quality/compression level
$imageProcess.Filters.Add($imageProcess.FilterInfos.Item("Convert").FilterID)
$imageProcess.Filters.Item(1).Properties.Item("FormatID").Value = $wiaFormatJPEG
$imageProcess.Filters.Item(1).Properties.Item("Quality").Value = 5
$image = $imageProcess.Apply($image)
# Build filepath from desktop path and filename 'Scan 0'
$filename = "$([Environment]::GetFolderPath("Desktop"))\Scan {0}.jpg"
# If a file named 'Scan 0' already exists, increment the index as long as needed
$index = 0
while (test-path ($filename -f $index)) {[void](++$index)}
$filename = $filename -f $index
# Save image to 'C:\Users\<username>\Desktop\Scan {x}'
$image.SaveFile($filename)
# Show image
& $filename
自定义
- 如果您需要其他图像格式,请更改
Item("FormatID").Value = $wiaFormatJPEG
为(或 TIFF、BMP、GIF)$wiaFormatPNG
$([Environment]::GetFolderPath("Desktop"))\Scan {0}.jpg"
如果需要其他输出路径,请进行更改。.jpg
如果之前更改过图像格式,请更改扩展名
使用的资源
- http://www.da5is.com/2013/09/08/quick-powershell-to-scan-to-evernote/
- http://msdn.microsoft.com/en-us/library/ms630814(v=vs.85).aspx
- http://ardalis.com/powershell-control-over-nikon-d3000-camera
- http://msdn.microsoft.com/en-us/library/windows/desktop/ms630806(v=vs.85).aspx
- http://deletethis.net/dave/?uri=http%3A%2F%2Fcerealnumber.livejournal.com%2F47638.html
- https://msdn.microsoft.com/en-us/library/windows/desktop/ms630810(v=vs.85).aspx
- https://stackoverflow.com/a/28422467/935614
- https://msdn.microsoft.com/en-us/library/ms630819(v=vs.85).aspx#FilterSharedSample016
答案2
这是我正在使用的 ps 脚本,我从这个线程中的一个答案中复制了它,并对其进行了修改,以便与另一个进纸器一起使用,如果您不使用玻璃进纸器,您可以通过将“prop 值”更改为 0 1 2 来修改进纸器。此脚本不会在扫描后显示图像,而只会保存它。
# Create object to access the scanner
$deviceManager = new-object -ComObject WIA.DeviceManager
$device = $deviceManager.DeviceInfos.Item(1).Connect()
# Set the scanner source to the feeder
foreach ($prop in $device.Properties) {
if ($prop.Name -eq "Document Handling Select") {
$prop.Value = 1
}
}
# Create object to access the scanned image later
$imageProcess = new-object -ComObject WIA.ImageProcess
# Store file format GUID strings
$wiaFormatJPEG = "{B96B3CAE-0728-11D3-9D7B-0000F81EF32E}"
# Scan the image from scanner as BMP
foreach ($item in $device.Items) {
$image = $item.Transfer()
}
# set type to JPEG and quality/compression level
$imageProcess.Filters.Add($imageProcess.FilterInfos.Item("Convert").FilterID)
$imageProcess.Filters.Item(1).Properties.Item("FormatID").Value = $wiaFormatJPEG
$imageProcess.Filters.Item(1).Properties.Item("Quality").Value = 5
$image = $imageProcess.Apply($image)
# Build filepath from C:\scan path and filename 'Scan 0'
$filename = "C:\scan\Scan {0}.pdf"
# If a file named 'Scan 0' already exists, increment the index as long as needed
$index = 0
while (test-path ($filename -f $index)) { [void] (++$index)}
$filename = $filename -f $index
# Save image to 'C:\scan\Scan {x}'
$image.SaveFile($filename)
答案3
这可能在 stackoverflow 上更适用。搜索标签“WIA”,会发现有人已经解决了自动化问题。专家级用户。
编写一个 vbscript 来启动对话框非常简单,但是(据我有限的知识所知)(a)WIA 需要主机来处理扫描的图像,因此您所做的任何事情都需要接收和存储图像(而不仅仅是启动对话框);(b)WIA 对话框似乎没有“无人值守”模式。
为您提供的资源:WIA自动化
还有一个用于启动 wia 的 vbs 脚本(创建一个名为例如的文本文件launchWia.vbs
):
set oDlg = CreateObject("WIA.CommonDialog")
oDlg.ShowAcquireImage()
可以使用批处理文件运行:
cscript launchWia.vbs
pause
可以通过快捷方式运行。
再次强调,由于它不处理图像,因此可能不会给您带来任何帮助。请参阅 MSDN 文档以获取处理图像的示例。
答案4
扫描工具
Set CommonDialog = CreateObject("WIA.CommonDialog")
Set DeviceManager = CreateObject("WIA.DeviceManager")
' List all Available Devices by Name and DeviceID
' The following example shows how to list all available Deviceices by name and DeviceID.
Dim i, n 'As Integer
n = DeviceManager.DeviceInfos.Count
WScript.Echo "Number of Deviceice found = " & n
For i = 1 to DeviceManager.DeviceInfos.Count
WScript.Echo " Device " & i & ":" & vbTab & DeviceManager.DeviceInfos(i).Properties("Name").Value & vbTab & "(" & DeviceManager.DeviceInfos(i).DeviceID & ")"
Next
Set DevInfo = DeviceManager.DeviceInfos(1)
Set Device = DevInfo.Connect
Device.Items(1).Properties("6146").Value = 2 'colors
Device.Items(1).Properties("6147").Value = 600 'dots per inch/horizontal
Device.Items(1).Properties("6148").Value = 600 'dots per inch/vertical
Device.Items(1).Properties("6149").Value = 0 'x point where to start scan
Device.Items(1).Properties("6150").Value = 0 'y point where to start scan
Device.Items(1).Properties("6151").Value = 5100 'horizontal exent DPI x inches wide
Device.Items(1).Properties("6152").Value = 7002 'vertical extent DPI x inches tall
Device.Items(1).Properties("4104").Value = 8 'bits per pixel
'Device.Items(1).Properties("3098").Value = 1700 'page width
'Device.Items(1).Properties("3099").Value = 2196 'page height
Set img = CommonDialog.ShowTransfer(Device.Items(1), "{B96B3CAB-0728-11D3-9D7B-0000F81EF32E}", true)
img.SaveFile "F:/image.bmp"
跑步"C:/Windows/System32/cscript.exe" //X "F:/scan.vbs"