mirror of
https://github.com/soukoku/ntwain.git
synced 2025-12-19 10:58:24 +08:00
Try to put KDS values in own namespace and enum.
This commit is contained in:
19
NTwain.sln
19
NTwain.sln
@@ -31,6 +31,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "csizes", "csizes\csizes.vcx
|
|||||||
EndProject
|
EndProject
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WinConsole32", "samples\WinConsole32\WinConsole32.csproj", "{4E2417E7-FDC3-46D7-B976-84A97B500B74}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "WinConsole32", "samples\WinConsole32\WinConsole32.csproj", "{4E2417E7-FDC3-46D7-B976-84A97B500B74}"
|
||||||
EndProject
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ScannerTester", "samples\ScannerTester\ScannerTester.csproj", "{EEFDA89D-7E11-7609-5383-FA1ADEA88CF4}"
|
||||||
|
EndProject
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
Debug|Any CPU = Debug|Any CPU
|
Debug|Any CPU = Debug|Any CPU
|
||||||
@@ -123,6 +125,22 @@ Global
|
|||||||
{4E2417E7-FDC3-46D7-B976-84A97B500B74}.Release|x64.Build.0 = Release|Any CPU
|
{4E2417E7-FDC3-46D7-B976-84A97B500B74}.Release|x64.Build.0 = Release|Any CPU
|
||||||
{4E2417E7-FDC3-46D7-B976-84A97B500B74}.Release|x86.ActiveCfg = Release|Any CPU
|
{4E2417E7-FDC3-46D7-B976-84A97B500B74}.Release|x86.ActiveCfg = Release|Any CPU
|
||||||
{4E2417E7-FDC3-46D7-B976-84A97B500B74}.Release|x86.Build.0 = Release|Any CPU
|
{4E2417E7-FDC3-46D7-B976-84A97B500B74}.Release|x86.Build.0 = Release|Any CPU
|
||||||
|
{EEFDA89D-7E11-7609-5383-FA1ADEA88CF4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{EEFDA89D-7E11-7609-5383-FA1ADEA88CF4}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{EEFDA89D-7E11-7609-5383-FA1ADEA88CF4}.Debug|ARM64.ActiveCfg = Debug|Any CPU
|
||||||
|
{EEFDA89D-7E11-7609-5383-FA1ADEA88CF4}.Debug|ARM64.Build.0 = Debug|Any CPU
|
||||||
|
{EEFDA89D-7E11-7609-5383-FA1ADEA88CF4}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||||
|
{EEFDA89D-7E11-7609-5383-FA1ADEA88CF4}.Debug|x64.Build.0 = Debug|Any CPU
|
||||||
|
{EEFDA89D-7E11-7609-5383-FA1ADEA88CF4}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||||
|
{EEFDA89D-7E11-7609-5383-FA1ADEA88CF4}.Debug|x86.Build.0 = Debug|Any CPU
|
||||||
|
{EEFDA89D-7E11-7609-5383-FA1ADEA88CF4}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{EEFDA89D-7E11-7609-5383-FA1ADEA88CF4}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{EEFDA89D-7E11-7609-5383-FA1ADEA88CF4}.Release|ARM64.ActiveCfg = Release|Any CPU
|
||||||
|
{EEFDA89D-7E11-7609-5383-FA1ADEA88CF4}.Release|ARM64.Build.0 = Release|Any CPU
|
||||||
|
{EEFDA89D-7E11-7609-5383-FA1ADEA88CF4}.Release|x64.ActiveCfg = Release|Any CPU
|
||||||
|
{EEFDA89D-7E11-7609-5383-FA1ADEA88CF4}.Release|x64.Build.0 = Release|Any CPU
|
||||||
|
{EEFDA89D-7E11-7609-5383-FA1ADEA88CF4}.Release|x86.ActiveCfg = Release|Any CPU
|
||||||
|
{EEFDA89D-7E11-7609-5383-FA1ADEA88CF4}.Release|x86.Build.0 = Release|Any CPU
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
HideSolutionNode = FALSE
|
HideSolutionNode = FALSE
|
||||||
@@ -131,6 +149,7 @@ Global
|
|||||||
{7792A94E-D0B4-440D-8BD5-CA1CA548782C} = {707B4313-8EF8-4D0F-A95E-590783422187}
|
{7792A94E-D0B4-440D-8BD5-CA1CA548782C} = {707B4313-8EF8-4D0F-A95E-590783422187}
|
||||||
{C9666CB2-C9A6-48C8-AB51-D616A48058A7} = {707B4313-8EF8-4D0F-A95E-590783422187}
|
{C9666CB2-C9A6-48C8-AB51-D616A48058A7} = {707B4313-8EF8-4D0F-A95E-590783422187}
|
||||||
{4E2417E7-FDC3-46D7-B976-84A97B500B74} = {707B4313-8EF8-4D0F-A95E-590783422187}
|
{4E2417E7-FDC3-46D7-B976-84A97B500B74} = {707B4313-8EF8-4D0F-A95E-590783422187}
|
||||||
|
{EEFDA89D-7E11-7609-5383-FA1ADEA88CF4} = {707B4313-8EF8-4D0F-A95E-590783422187}
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||||
SolutionGuid = {7459323B-44F6-4E07-8574-E1B4B525086B}
|
SolutionGuid = {7459323B-44F6-4E07-8574-E1B4B525086B}
|
||||||
|
|||||||
341
samples/ScannerTester/MainForm.Designer.cs
generated
Normal file
341
samples/ScannerTester/MainForm.Designer.cs
generated
Normal file
@@ -0,0 +1,341 @@
|
|||||||
|
namespace ScannerTester
|
||||||
|
{
|
||||||
|
partial class MainForm
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Required designer variable.
|
||||||
|
/// </summary>
|
||||||
|
private System.ComponentModel.IContainer components = null;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Clean up any resources being used.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
|
||||||
|
protected override void Dispose(bool disposing)
|
||||||
|
{
|
||||||
|
if (disposing && (components != null))
|
||||||
|
{
|
||||||
|
components.Dispose();
|
||||||
|
}
|
||||||
|
base.Dispose(disposing);
|
||||||
|
}
|
||||||
|
|
||||||
|
#region Windows Form Designer generated code
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Required method for Designer support - do not modify
|
||||||
|
/// the contents of this method with the code editor.
|
||||||
|
/// </summary>
|
||||||
|
private void InitializeComponent()
|
||||||
|
{
|
||||||
|
label1 = new Label();
|
||||||
|
btnSelectScanner = new Button();
|
||||||
|
groupSettings = new GroupBox();
|
||||||
|
listFormat = new ComboBox();
|
||||||
|
label7 = new Label();
|
||||||
|
boxNamePrefix = new TextBox();
|
||||||
|
label6 = new Label();
|
||||||
|
btnOpenFolder = new Button();
|
||||||
|
btnBrowseFolder = new Button();
|
||||||
|
boxFolder = new TextBox();
|
||||||
|
label5 = new Label();
|
||||||
|
boxLimit = new NumericUpDown();
|
||||||
|
label4 = new Label();
|
||||||
|
listDpi = new ComboBox();
|
||||||
|
label3 = new Label();
|
||||||
|
lblCurScanner = new Label();
|
||||||
|
groupTest = new GroupBox();
|
||||||
|
boxLog = new RichTextBox();
|
||||||
|
label2 = new Label();
|
||||||
|
ckShowUI = new CheckBox();
|
||||||
|
btnStop = new Button();
|
||||||
|
btnTransfer = new Button();
|
||||||
|
btnDriverOnly = new Button();
|
||||||
|
groupSettings.SuspendLayout();
|
||||||
|
((System.ComponentModel.ISupportInitialize)boxLimit).BeginInit();
|
||||||
|
groupTest.SuspendLayout();
|
||||||
|
SuspendLayout();
|
||||||
|
//
|
||||||
|
// label1
|
||||||
|
//
|
||||||
|
label1.AutoSize = true;
|
||||||
|
label1.Location = new Point(12, 9);
|
||||||
|
label1.Name = "label1";
|
||||||
|
label1.Size = new Size(612, 25);
|
||||||
|
label1.TabIndex = 0;
|
||||||
|
label1.Text = "Use this tool to see if the scanner can be used with the ScanCloud Scan App";
|
||||||
|
//
|
||||||
|
// btnSelectScanner
|
||||||
|
//
|
||||||
|
btnSelectScanner.Location = new Point(12, 46);
|
||||||
|
btnSelectScanner.Name = "btnSelectScanner";
|
||||||
|
btnSelectScanner.Size = new Size(238, 34);
|
||||||
|
btnSelectScanner.TabIndex = 1;
|
||||||
|
btnSelectScanner.Text = "Choose Scanner...";
|
||||||
|
btnSelectScanner.UseVisualStyleBackColor = true;
|
||||||
|
btnSelectScanner.Click += btnSelectScanner_Click;
|
||||||
|
//
|
||||||
|
// groupSettings
|
||||||
|
//
|
||||||
|
groupSettings.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left;
|
||||||
|
groupSettings.Controls.Add(listFormat);
|
||||||
|
groupSettings.Controls.Add(label7);
|
||||||
|
groupSettings.Controls.Add(boxNamePrefix);
|
||||||
|
groupSettings.Controls.Add(label6);
|
||||||
|
groupSettings.Controls.Add(btnOpenFolder);
|
||||||
|
groupSettings.Controls.Add(btnBrowseFolder);
|
||||||
|
groupSettings.Controls.Add(boxFolder);
|
||||||
|
groupSettings.Controls.Add(label5);
|
||||||
|
groupSettings.Controls.Add(boxLimit);
|
||||||
|
groupSettings.Controls.Add(label4);
|
||||||
|
groupSettings.Controls.Add(listDpi);
|
||||||
|
groupSettings.Controls.Add(label3);
|
||||||
|
groupSettings.Location = new Point(12, 99);
|
||||||
|
groupSettings.Name = "groupSettings";
|
||||||
|
groupSettings.Size = new Size(742, 932);
|
||||||
|
groupSettings.TabIndex = 2;
|
||||||
|
groupSettings.TabStop = false;
|
||||||
|
groupSettings.Text = "Settings";
|
||||||
|
//
|
||||||
|
// listFormat
|
||||||
|
//
|
||||||
|
listFormat.DropDownStyle = ComboBoxStyle.DropDownList;
|
||||||
|
listFormat.FormattingEnabled = true;
|
||||||
|
listFormat.Location = new Point(157, 243);
|
||||||
|
listFormat.Name = "listFormat";
|
||||||
|
listFormat.Size = new Size(182, 33);
|
||||||
|
listFormat.TabIndex = 10;
|
||||||
|
//
|
||||||
|
// label7
|
||||||
|
//
|
||||||
|
label7.AutoSize = true;
|
||||||
|
label7.Location = new Point(47, 246);
|
||||||
|
label7.Name = "label7";
|
||||||
|
label7.Size = new Size(100, 25);
|
||||||
|
label7.TabIndex = 9;
|
||||||
|
label7.Text = "File Format";
|
||||||
|
//
|
||||||
|
// boxNamePrefix
|
||||||
|
//
|
||||||
|
boxNamePrefix.Location = new Point(157, 207);
|
||||||
|
boxNamePrefix.Name = "boxNamePrefix";
|
||||||
|
boxNamePrefix.Size = new Size(182, 31);
|
||||||
|
boxNamePrefix.TabIndex = 8;
|
||||||
|
boxNamePrefix.Text = "Capture_";
|
||||||
|
//
|
||||||
|
// label6
|
||||||
|
//
|
||||||
|
label6.AutoSize = true;
|
||||||
|
label6.Location = new Point(13, 210);
|
||||||
|
label6.Name = "label6";
|
||||||
|
label6.Size = new Size(138, 25);
|
||||||
|
label6.TabIndex = 7;
|
||||||
|
label6.Text = "File Name Prefix";
|
||||||
|
//
|
||||||
|
// btnOpenFolder
|
||||||
|
//
|
||||||
|
btnOpenFolder.Location = new Point(275, 167);
|
||||||
|
btnOpenFolder.Name = "btnOpenFolder";
|
||||||
|
btnOpenFolder.Size = new Size(112, 34);
|
||||||
|
btnOpenFolder.TabIndex = 6;
|
||||||
|
btnOpenFolder.Text = "Open";
|
||||||
|
btnOpenFolder.UseVisualStyleBackColor = true;
|
||||||
|
btnOpenFolder.Click += btnOpenFolder_Click;
|
||||||
|
//
|
||||||
|
// btnBrowseFolder
|
||||||
|
//
|
||||||
|
btnBrowseFolder.Location = new Point(157, 167);
|
||||||
|
btnBrowseFolder.Name = "btnBrowseFolder";
|
||||||
|
btnBrowseFolder.Size = new Size(112, 34);
|
||||||
|
btnBrowseFolder.TabIndex = 6;
|
||||||
|
btnBrowseFolder.Text = "Browse...";
|
||||||
|
btnBrowseFolder.UseVisualStyleBackColor = true;
|
||||||
|
btnBrowseFolder.Click += btnBrowseFolder_Click;
|
||||||
|
//
|
||||||
|
// boxFolder
|
||||||
|
//
|
||||||
|
boxFolder.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
|
||||||
|
boxFolder.Location = new Point(157, 130);
|
||||||
|
boxFolder.Name = "boxFolder";
|
||||||
|
boxFolder.Size = new Size(556, 31);
|
||||||
|
boxFolder.TabIndex = 5;
|
||||||
|
boxFolder.Text = "Images";
|
||||||
|
//
|
||||||
|
// label5
|
||||||
|
//
|
||||||
|
label5.AutoSize = true;
|
||||||
|
label5.Location = new Point(47, 133);
|
||||||
|
label5.Name = "label5";
|
||||||
|
label5.Size = new Size(104, 25);
|
||||||
|
label5.TabIndex = 4;
|
||||||
|
label5.Text = "Save Folder";
|
||||||
|
//
|
||||||
|
// boxLimit
|
||||||
|
//
|
||||||
|
boxLimit.Location = new Point(157, 93);
|
||||||
|
boxLimit.Minimum = new decimal(new int[] { 1, 0, 0, int.MinValue });
|
||||||
|
boxLimit.Name = "boxLimit";
|
||||||
|
boxLimit.Size = new Size(182, 31);
|
||||||
|
boxLimit.TabIndex = 3;
|
||||||
|
boxLimit.Value = new decimal(new int[] { 1, 0, 0, int.MinValue });
|
||||||
|
//
|
||||||
|
// label4
|
||||||
|
//
|
||||||
|
label4.AutoSize = true;
|
||||||
|
label4.Location = new Point(35, 95);
|
||||||
|
label4.Name = "label4";
|
||||||
|
label4.Size = new Size(116, 25);
|
||||||
|
label4.TabIndex = 2;
|
||||||
|
label4.Text = "Transfer Limit";
|
||||||
|
//
|
||||||
|
// listDpi
|
||||||
|
//
|
||||||
|
listDpi.DropDownStyle = ComboBoxStyle.DropDownList;
|
||||||
|
listDpi.FormattingEnabled = true;
|
||||||
|
listDpi.Location = new Point(157, 54);
|
||||||
|
listDpi.Name = "listDpi";
|
||||||
|
listDpi.Size = new Size(182, 33);
|
||||||
|
listDpi.TabIndex = 1;
|
||||||
|
//
|
||||||
|
// label3
|
||||||
|
//
|
||||||
|
label3.AutoSize = true;
|
||||||
|
label3.Location = new Point(111, 57);
|
||||||
|
label3.Name = "label3";
|
||||||
|
label3.Size = new Size(40, 25);
|
||||||
|
label3.TabIndex = 0;
|
||||||
|
label3.Text = "DPI";
|
||||||
|
//
|
||||||
|
// lblCurScanner
|
||||||
|
//
|
||||||
|
lblCurScanner.AutoSize = true;
|
||||||
|
lblCurScanner.Location = new Point(256, 51);
|
||||||
|
lblCurScanner.Name = "lblCurScanner";
|
||||||
|
lblCurScanner.Size = new Size(124, 25);
|
||||||
|
lblCurScanner.TabIndex = 3;
|
||||||
|
lblCurScanner.Text = "None selected";
|
||||||
|
//
|
||||||
|
// groupTest
|
||||||
|
//
|
||||||
|
groupTest.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right;
|
||||||
|
groupTest.Controls.Add(boxLog);
|
||||||
|
groupTest.Controls.Add(label2);
|
||||||
|
groupTest.Controls.Add(ckShowUI);
|
||||||
|
groupTest.Controls.Add(btnStop);
|
||||||
|
groupTest.Controls.Add(btnTransfer);
|
||||||
|
groupTest.Controls.Add(btnDriverOnly);
|
||||||
|
groupTest.Location = new Point(760, 99);
|
||||||
|
groupTest.Name = "groupTest";
|
||||||
|
groupTest.Size = new Size(1038, 932);
|
||||||
|
groupTest.TabIndex = 4;
|
||||||
|
groupTest.TabStop = false;
|
||||||
|
groupTest.Text = "Test";
|
||||||
|
//
|
||||||
|
// boxLog
|
||||||
|
//
|
||||||
|
boxLog.Anchor = AnchorStyles.Top | AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right;
|
||||||
|
boxLog.Location = new Point(22, 118);
|
||||||
|
boxLog.Name = "boxLog";
|
||||||
|
boxLog.Size = new Size(999, 796);
|
||||||
|
boxLog.TabIndex = 4;
|
||||||
|
boxLog.Text = "";
|
||||||
|
//
|
||||||
|
// label2
|
||||||
|
//
|
||||||
|
label2.AutoSize = true;
|
||||||
|
label2.Location = new Point(22, 90);
|
||||||
|
label2.Name = "label2";
|
||||||
|
label2.Size = new Size(50, 25);
|
||||||
|
label2.TabIndex = 3;
|
||||||
|
label2.Text = "Logs";
|
||||||
|
//
|
||||||
|
// ckShowUI
|
||||||
|
//
|
||||||
|
ckShowUI.AutoSize = true;
|
||||||
|
ckShowUI.Location = new Point(451, 43);
|
||||||
|
ckShowUI.Name = "ckShowUI";
|
||||||
|
ckShowUI.Size = new Size(253, 29);
|
||||||
|
ckShowUI.TabIndex = 2;
|
||||||
|
ckShowUI.Text = "Show driver during capture";
|
||||||
|
ckShowUI.UseVisualStyleBackColor = true;
|
||||||
|
//
|
||||||
|
// btnStop
|
||||||
|
//
|
||||||
|
btnStop.Anchor = AnchorStyles.Top | AnchorStyles.Right;
|
||||||
|
btnStop.Location = new Point(897, 39);
|
||||||
|
btnStop.Name = "btnStop";
|
||||||
|
btnStop.Size = new Size(124, 34);
|
||||||
|
btnStop.TabIndex = 2;
|
||||||
|
btnStop.Text = "Stop";
|
||||||
|
btnStop.UseVisualStyleBackColor = true;
|
||||||
|
btnStop.Click += btnStop_Click;
|
||||||
|
//
|
||||||
|
// btnTransfer
|
||||||
|
//
|
||||||
|
btnTransfer.Location = new Point(239, 39);
|
||||||
|
btnTransfer.Name = "btnTransfer";
|
||||||
|
btnTransfer.Size = new Size(206, 34);
|
||||||
|
btnTransfer.TabIndex = 1;
|
||||||
|
btnTransfer.Text = "Start Capture";
|
||||||
|
btnTransfer.UseVisualStyleBackColor = true;
|
||||||
|
btnTransfer.Click += btnTransfer_Click;
|
||||||
|
//
|
||||||
|
// btnDriverOnly
|
||||||
|
//
|
||||||
|
btnDriverOnly.Location = new Point(22, 39);
|
||||||
|
btnDriverOnly.Name = "btnDriverOnly";
|
||||||
|
btnDriverOnly.Size = new Size(206, 34);
|
||||||
|
btnDriverOnly.TabIndex = 0;
|
||||||
|
btnDriverOnly.Text = "Open Driver UI";
|
||||||
|
btnDriverOnly.UseVisualStyleBackColor = true;
|
||||||
|
btnDriverOnly.Click += btnDriverOnly_Click;
|
||||||
|
//
|
||||||
|
// MainForm
|
||||||
|
//
|
||||||
|
AutoScaleDimensions = new SizeF(10F, 25F);
|
||||||
|
AutoScaleMode = AutoScaleMode.Font;
|
||||||
|
ClientSize = new Size(1810, 1043);
|
||||||
|
Controls.Add(groupTest);
|
||||||
|
Controls.Add(lblCurScanner);
|
||||||
|
Controls.Add(groupSettings);
|
||||||
|
Controls.Add(btnSelectScanner);
|
||||||
|
Controls.Add(label1);
|
||||||
|
Name = "MainForm";
|
||||||
|
SizeGripStyle = SizeGripStyle.Show;
|
||||||
|
Text = "Scanner Tester Utility";
|
||||||
|
groupSettings.ResumeLayout(false);
|
||||||
|
groupSettings.PerformLayout();
|
||||||
|
((System.ComponentModel.ISupportInitialize)boxLimit).EndInit();
|
||||||
|
groupTest.ResumeLayout(false);
|
||||||
|
groupTest.PerformLayout();
|
||||||
|
ResumeLayout(false);
|
||||||
|
PerformLayout();
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
|
||||||
|
private Label label1;
|
||||||
|
private Button btnSelectScanner;
|
||||||
|
private GroupBox groupSettings;
|
||||||
|
private Label lblCurScanner;
|
||||||
|
private GroupBox groupTest;
|
||||||
|
private CheckBox ckShowUI;
|
||||||
|
private Button btnTransfer;
|
||||||
|
private Button btnDriverOnly;
|
||||||
|
private RichTextBox boxLog;
|
||||||
|
private Label label2;
|
||||||
|
private Button btnStop;
|
||||||
|
private ComboBox listDpi;
|
||||||
|
private Label label3;
|
||||||
|
private Label label4;
|
||||||
|
private NumericUpDown boxLimit;
|
||||||
|
private Label label5;
|
||||||
|
private Button btnOpenFolder;
|
||||||
|
private Button btnBrowseFolder;
|
||||||
|
private TextBox boxFolder;
|
||||||
|
private TextBox boxNamePrefix;
|
||||||
|
private Label label6;
|
||||||
|
private ComboBox listFormat;
|
||||||
|
private Label label7;
|
||||||
|
}
|
||||||
|
}
|
||||||
591
samples/ScannerTester/MainForm.cs
Normal file
591
samples/ScannerTester/MainForm.cs
Normal file
@@ -0,0 +1,591 @@
|
|||||||
|
using NTwain;
|
||||||
|
using NTwain.Data;
|
||||||
|
using NTwain.Data.KDS;
|
||||||
|
using NTwain.Triplets;
|
||||||
|
using System.ComponentModel;
|
||||||
|
using System.Diagnostics;
|
||||||
|
using System.Text;
|
||||||
|
|
||||||
|
namespace ScannerTester
|
||||||
|
{
|
||||||
|
public partial class MainForm : Form
|
||||||
|
{
|
||||||
|
TwainAppSession _twain;
|
||||||
|
private bool _stopTransfer;
|
||||||
|
|
||||||
|
public MainForm()
|
||||||
|
{
|
||||||
|
InitializeComponent();
|
||||||
|
|
||||||
|
_twain = new TwainAppSession();
|
||||||
|
_twain.TransferReady += _twain_TransferReady;
|
||||||
|
_twain.Transferred += _twain_Transferred;
|
||||||
|
_twain.SourceDisabled += _twain_SourceDisabled;
|
||||||
|
_twain.AddWinformFilter();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void _twain_SourceDisabled(TwainAppSession sender, TW_IDENTITY_LEGACY e)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void OnLoad(EventArgs e)
|
||||||
|
{
|
||||||
|
base.OnLoad(e);
|
||||||
|
_twain.OpenDSM(Handle, SynchronizationContext.Current!);
|
||||||
|
//_ = _twain.OpenDSMAsync();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void OnClosed(EventArgs e)
|
||||||
|
{
|
||||||
|
_twain.CloseDSM();
|
||||||
|
//_ = _twain.CloseDSMAsync();
|
||||||
|
base.OnClosed(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void _twain_Transferred(TwainAppSession sender, TransferredEventArgs e)
|
||||||
|
{
|
||||||
|
Invoke(() =>
|
||||||
|
{
|
||||||
|
TW_EXTIMAGEINFO extInfo = TW_EXTIMAGEINFO.CreateRequest(TWEI.CAMERA);
|
||||||
|
e.GetExtendedImageInfo(ref extInfo);
|
||||||
|
string? camera = null;
|
||||||
|
foreach (var ei in extInfo.AsInfos())
|
||||||
|
{
|
||||||
|
if (ei.ReturnCode == TWRC.SUCCESS)
|
||||||
|
{
|
||||||
|
switch (ei.InfoId)
|
||||||
|
{
|
||||||
|
//case (TWEI)KDS_TWEI.HDR_PAGENUMBER:
|
||||||
|
// LogIt($"TWEI_HDR_PAGENUMBER Value = {ei.ReadNonPointerData<int>()}");
|
||||||
|
// break;
|
||||||
|
case TWEI.CAMERA:
|
||||||
|
camera = ei.ReadHandleString(_twain);
|
||||||
|
LogIt($"{ei.InfoId} Value = {camera}");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
LogIt($"{ei.InfoId} RC = {ei.ReturnCode}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
extInfo.Free(_twain);
|
||||||
|
|
||||||
|
if (e.Data != null)
|
||||||
|
{
|
||||||
|
LogIt($"Received {e.ImageInfo.PixelType} in {e.ImageInfo.Compression} compressed memory image.");
|
||||||
|
var folder = boxFolder.Text;
|
||||||
|
if (string.IsNullOrWhiteSpace(folder))
|
||||||
|
{
|
||||||
|
folder = "Images";
|
||||||
|
Directory.CreateDirectory(folder);
|
||||||
|
boxFolder.Text = folder;
|
||||||
|
}
|
||||||
|
var prefix = boxNamePrefix.Text;
|
||||||
|
if (string.IsNullOrWhiteSpace(prefix))
|
||||||
|
{
|
||||||
|
prefix = "Capture_";
|
||||||
|
boxNamePrefix.Text = prefix;
|
||||||
|
}
|
||||||
|
|
||||||
|
using (var img = System.Drawing.Image.FromStream(e.Data.AsStream()))
|
||||||
|
{
|
||||||
|
//var saveFile = img.SaveToSmallestFormat(folder, prefix, lossless: false).ToString();
|
||||||
|
//LogIt($"File saved to {saveFile}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (e.FileInfo != null)
|
||||||
|
{
|
||||||
|
var info = e.FileInfo.Value;
|
||||||
|
var path = info.FileName.ToString();
|
||||||
|
LogIt($"Received {e.ImageInfo.PixelType} {info.Format} in {e.ImageInfo.Compression} compressed file {path}");
|
||||||
|
}
|
||||||
|
e.Dispose();
|
||||||
|
LogIt("");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
int _xferCount = 0;
|
||||||
|
private void _twain_TransferReady(TwainAppSession sender, TransferReadyEventArgs e)
|
||||||
|
{
|
||||||
|
Invoke(() =>
|
||||||
|
{
|
||||||
|
if (_stopTransfer)
|
||||||
|
{
|
||||||
|
e.Cancel = CancelType.EndNow;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
_xferCount++;
|
||||||
|
LogIt($"Got pending transfer with mode = {e.ImgXferMech}");
|
||||||
|
if (e.ImgXferMech == TWSX.FILE)
|
||||||
|
{
|
||||||
|
var folder = boxFolder.Text;
|
||||||
|
if (string.IsNullOrWhiteSpace(folder))
|
||||||
|
{
|
||||||
|
folder = "Images";
|
||||||
|
Directory.CreateDirectory(folder);
|
||||||
|
boxFolder.Text = folder;
|
||||||
|
}
|
||||||
|
var prefix = boxNamePrefix.Text;
|
||||||
|
if (string.IsNullOrWhiteSpace(prefix))
|
||||||
|
{
|
||||||
|
prefix = "Capture_";
|
||||||
|
boxNamePrefix.Text = prefix;
|
||||||
|
}
|
||||||
|
|
||||||
|
TWCP comp = TWCP.NONE;
|
||||||
|
TW_EXTIMAGEINFO extInfo = TW_EXTIMAGEINFO.CreateRequest((TWEI)KDS_TWEI.HDR_COMPRESSION);
|
||||||
|
e.GetExtendedImageInfo(ref extInfo);
|
||||||
|
foreach (var ei in extInfo.AsInfos())
|
||||||
|
{
|
||||||
|
if (ei.ReturnCode == TWRC.SUCCESS)
|
||||||
|
{
|
||||||
|
switch (ei.InfoId)
|
||||||
|
{
|
||||||
|
case (TWEI)KDS_TWEI.HDR_COMPRESSION:
|
||||||
|
comp = ei.ReadNonPointerData<TWCP>();
|
||||||
|
LogIt($"{ei.InfoId} Value = {comp}");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
LogIt($"{ei.InfoId} RC = {ei.ReturnCode}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
extInfo.Free(_twain);
|
||||||
|
|
||||||
|
LogIt($"Compression at ready step = {comp}");
|
||||||
|
string? targetName = $"{prefix}_{_xferCount:D4}";
|
||||||
|
TWFF format = TWFF.TIFF;
|
||||||
|
switch (comp)
|
||||||
|
{
|
||||||
|
case TWCP.JPEG:
|
||||||
|
targetName = $"{prefix}_{_xferCount:D4}.jpg";
|
||||||
|
format = TWFF.JFIF;
|
||||||
|
break;
|
||||||
|
case TWCP.NONE:
|
||||||
|
targetName = $"{prefix}_{_xferCount:D4}.bmp";
|
||||||
|
format = TWFF.BMP;
|
||||||
|
break;
|
||||||
|
case TWCP.GROUP4:
|
||||||
|
default:
|
||||||
|
targetName = $"{prefix}_{_xferCount:D4}.tif";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
TW_SETUPFILEXFER setup = new()
|
||||||
|
{
|
||||||
|
FileName = Path.Combine(folder, targetName),
|
||||||
|
Format = format
|
||||||
|
};
|
||||||
|
|
||||||
|
var sts = e.SetupFileTransfer(ref setup);
|
||||||
|
|
||||||
|
LogIt($"Want to save image as {setup.Format} {setup.FileName}.", sts);
|
||||||
|
|
||||||
|
var appId = _twain.AppIdentity;
|
||||||
|
var srcId = _twain.CurrentSource;
|
||||||
|
sts = _twain.WrapInSTS(DGControl.SetupFileXfer.Get(ref appId, ref srcId, out setup));
|
||||||
|
|
||||||
|
LogIt($"Checked actual file settings as {setup.Format} {setup.FileName}.", sts);
|
||||||
|
|
||||||
|
}
|
||||||
|
LogIt("");
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void OnClosing(CancelEventArgs e)
|
||||||
|
{
|
||||||
|
if (_twain.State > STATE.S5)
|
||||||
|
{
|
||||||
|
e.Cancel = true;
|
||||||
|
}
|
||||||
|
_twain.TryStepdown(STATE.S2);
|
||||||
|
base.OnClosing(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void btnSelectScanner_Click(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
var sts = _twain.ShowUserSelect();
|
||||||
|
if (sts.IsSuccess && _twain.DefaultSource.Id > 0)
|
||||||
|
{
|
||||||
|
if (_twain.State > STATE.S3)
|
||||||
|
{
|
||||||
|
_twain.TryStepdown(STATE.S3);
|
||||||
|
}
|
||||||
|
sts = _twain.OpenSource(_twain.DefaultSource);
|
||||||
|
LogIt("Open scanner", sts);
|
||||||
|
if (sts.IsSuccess)
|
||||||
|
{
|
||||||
|
var src = _twain.CurrentSource;
|
||||||
|
lblCurScanner.Text = $"{src.ProductName} | v{src.Version} | protocol: {src.ProtocolMajor}.{src.ProtocolMinor}";
|
||||||
|
LoadSettings();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
lblCurScanner.Text = "None selected";
|
||||||
|
}
|
||||||
|
|
||||||
|
private void LogIt(string msg)
|
||||||
|
{
|
||||||
|
boxLog.AppendText($"{msg}\n");
|
||||||
|
}
|
||||||
|
private void LogIt(string msg, STS sts)
|
||||||
|
{
|
||||||
|
if (sts.IsSuccess)
|
||||||
|
{
|
||||||
|
boxLog.AppendText($"{msg} result = {sts.RC}\n");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
boxLog.AppendText($"{msg} result = {sts.RC} - {sts.ConditionCode}\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void LoadSettings()
|
||||||
|
{
|
||||||
|
var mechs = _twain.Caps.ICAP_XFERMECH.Get();
|
||||||
|
|
||||||
|
if (!mechs.Contains(TWSX.FILE))
|
||||||
|
{
|
||||||
|
LogIt("File transfer is not supported.");
|
||||||
|
}
|
||||||
|
|
||||||
|
var sts = _twain.Caps.ICAP_XFERMECH.Set(TWSX.FILE);
|
||||||
|
LogIt("Use file transfer", sts);
|
||||||
|
|
||||||
|
if (_twain.Caps.ICAP_UNITS.GetCurrent().FirstOrDefault() != TWUN.INCHES)
|
||||||
|
{
|
||||||
|
sts = _twain.Caps.ICAP_UNITS.Set(TWUN.INCHES);
|
||||||
|
LogIt("Set unit to inches", sts);
|
||||||
|
}
|
||||||
|
|
||||||
|
var dpis = _twain.Caps.ICAP_XRESOLUTION.Get();
|
||||||
|
listDpi.Items.Clear();
|
||||||
|
if (dpis.Contains(200))
|
||||||
|
{
|
||||||
|
listDpi.Items.Add(200);
|
||||||
|
listDpi.SelectedItem = 200;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
LogIt("200 DPI doesn't appear to be supported.");
|
||||||
|
}
|
||||||
|
if (dpis.Contains(300))
|
||||||
|
{
|
||||||
|
listDpi.Items.Add(300);
|
||||||
|
listDpi.SelectedItem = 300;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
LogIt("300 DPI doesn't appear to be supported.");
|
||||||
|
}
|
||||||
|
|
||||||
|
var formats = _twain.Caps.ICAP_IMAGEFILEFORMAT.Get();
|
||||||
|
listFormat.Items.Clear();
|
||||||
|
foreach (var format in formats)
|
||||||
|
{
|
||||||
|
listFormat.Items.Add(format);
|
||||||
|
}
|
||||||
|
listFormat.SelectedItem = _twain.Caps.ICAP_IMAGEFILEFORMAT.GetCurrent().FirstOrDefault();
|
||||||
|
|
||||||
|
LogIt("");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void btnDriverOnly_Click(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
if (_twain.State != STATE.S4) return;
|
||||||
|
|
||||||
|
var sts = _twain.EnableSource(true, true);
|
||||||
|
LogIt("Show drivers", sts);
|
||||||
|
LogIt("");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void btnTransfer_Click(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
if (_twain.State != STATE.S4 || !EnsureBoxFolder()) return;
|
||||||
|
|
||||||
|
|
||||||
|
var _isIndustrialKodak = _twain.CurrentSource.ProductName.ToString().StartsWith("KODAK Scanner: i");
|
||||||
|
|
||||||
|
if (_isIndustrialKodak)
|
||||||
|
{
|
||||||
|
CaptureAsKodakSDMI();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
CaptureAsStandardScanner();
|
||||||
|
}
|
||||||
|
|
||||||
|
_stopTransfer = false;
|
||||||
|
_xferCount = 0;
|
||||||
|
var sts = _twain.EnableSource(ckShowUI.Checked, false);
|
||||||
|
LogIt("Start capture", sts);
|
||||||
|
LogIt("");
|
||||||
|
}
|
||||||
|
|
||||||
|
private void CaptureAsKodakSDMI()
|
||||||
|
{
|
||||||
|
LogIt("Attempting Kodak SDMI mode");
|
||||||
|
|
||||||
|
LogIt($"Resolution supports {FlattenFlag(_twain.Caps.ICAP_XRESOLUTION.Supports)}");
|
||||||
|
LogIt($"File format supports {FlattenFlag(_twain.Caps.ICAP_IMAGEFILEFORMAT.Supports)}");
|
||||||
|
LogIt($"Compression supports {FlattenFlag(_twain.Caps.ICAP_COMPRESSION.Supports)}");
|
||||||
|
LogIt($"EXTINFO supports {FlattenFlag(_twain.Caps.ICAP_EXTIMAGEINFO.Supports)}");
|
||||||
|
|
||||||
|
LogIt("");
|
||||||
|
|
||||||
|
var limit = (short)boxLimit.Value;
|
||||||
|
if (limit > 0) limit *= 2;
|
||||||
|
var sts = _twain.Caps.CAP_XFERCOUNT.Set(limit);
|
||||||
|
LogIt($"Set transfer limit {limit}", sts);
|
||||||
|
|
||||||
|
sts = _twain.Caps.ICAP_EXTIMAGEINFO.Set(TW_BOOL.True);
|
||||||
|
LogIt($"Set extimageinfo enabled", sts);
|
||||||
|
|
||||||
|
var format = (TWFF)listFormat.SelectedItem!;
|
||||||
|
sts = _twain.Caps.ICAP_IMAGEFILEFORMAT.Set(format);
|
||||||
|
LogIt($"Set {format} format.", sts);
|
||||||
|
|
||||||
|
if (!sts.IsSuccess)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
LogIt("");
|
||||||
|
|
||||||
|
var appId = _twain.AppIdentity;
|
||||||
|
var srcId = _twain.CurrentSource;
|
||||||
|
|
||||||
|
|
||||||
|
TW_FILESYSTEM fs = new() { InputName = "/Camera_Bitonal_Both" };
|
||||||
|
sts = _twain.WrapInSTS(DGControl.FileSystem.ChangeDirectory(ref appId, ref srcId, ref fs));
|
||||||
|
LogIt("Change to bw cameras", sts);
|
||||||
|
if (sts.IsSuccess)
|
||||||
|
{
|
||||||
|
sts = _twain.Caps.CAP_CAMERAENABLED.Set(TW_BOOL.True);
|
||||||
|
LogIt("Set camera enabled", sts);
|
||||||
|
|
||||||
|
var dpi = listDpi.SelectedValue == null ? 300 : Convert.ToInt32(listDpi.SelectedValue);
|
||||||
|
sts = _twain.Caps.ICAP_XRESOLUTION.Set(dpi);
|
||||||
|
LogIt("Set x-resolution", sts);
|
||||||
|
sts = _twain.Caps.ICAP_YRESOLUTION.Set(dpi);
|
||||||
|
LogIt("Set y-resolution", sts);
|
||||||
|
|
||||||
|
|
||||||
|
if (format != TWFF.BMP)
|
||||||
|
{
|
||||||
|
LogIt($"Current format={_twain.Caps.ICAP_IMAGEFILEFORMAT.GetCurrent().First()}");
|
||||||
|
LogIt($"Current compression={_twain.Caps.ICAP_COMPRESSION.GetCurrent().First()}");
|
||||||
|
if (_twain.Caps.ICAP_COMPRESSION.Supports.HasFlag(TWQC.SET))
|
||||||
|
{
|
||||||
|
sts = _twain.Caps.ICAP_COMPRESSION.Set(TWCP.GROUP4);
|
||||||
|
LogIt("Set compression to group4", sts);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
LogIt("");
|
||||||
|
|
||||||
|
|
||||||
|
fs = new() { FileType = (int)TWFY.CAMERA, InputName = "/Camera_Color_Both" }; sts = _twain.WrapInSTS(DGControl.FileSystem.ChangeDirectory(ref appId, ref srcId, ref fs));
|
||||||
|
LogIt("Change to color cameras", sts);
|
||||||
|
if (sts.IsSuccess)
|
||||||
|
{
|
||||||
|
sts = _twain.Caps.CAP_CAMERAENABLED.Set(TW_BOOL.True);
|
||||||
|
LogIt("Set camera enabled", sts);
|
||||||
|
|
||||||
|
|
||||||
|
var dpi = listDpi.SelectedValue == null ? 300 : Convert.ToInt32(listDpi.SelectedValue);
|
||||||
|
sts = _twain.Caps.ICAP_XRESOLUTION.Set(dpi);
|
||||||
|
LogIt("Set x-resolution", sts);
|
||||||
|
sts = _twain.Caps.ICAP_YRESOLUTION.Set(dpi);
|
||||||
|
LogIt("Set y-resolution", sts);
|
||||||
|
|
||||||
|
|
||||||
|
if (format != TWFF.BMP)
|
||||||
|
{
|
||||||
|
LogIt($"Current format={_twain.Caps.ICAP_IMAGEFILEFORMAT.GetCurrent().First()}");
|
||||||
|
LogIt($"Current compression={_twain.Caps.ICAP_COMPRESSION.GetCurrent().First()}");
|
||||||
|
if (_twain.Caps.ICAP_COMPRESSION.Supports.HasFlag(TWQC.SET))
|
||||||
|
{
|
||||||
|
sts = _twain.Caps.ICAP_COMPRESSION.Set(TWCP.JPEG);
|
||||||
|
LogIt("Set compression to jpg", sts);
|
||||||
|
if (sts.IsSuccess)
|
||||||
|
{
|
||||||
|
LogIt($"jpeg quality supports {FlattenFlag(_twain.Caps.ICAP_JPEGQUALITY.Supports)}");
|
||||||
|
|
||||||
|
short quality = 90;
|
||||||
|
sts = _twain.Caps.ICAP_JPEGQUALITY.Set((TWJQ)quality);
|
||||||
|
LogIt($"Set jpg quality to {quality}", sts);
|
||||||
|
if (!sts.IsSuccess)
|
||||||
|
{
|
||||||
|
quality = 85;
|
||||||
|
sts = _twain.Caps.ICAP_JPEGQUALITY.Set((TWJQ)quality);
|
||||||
|
LogIt($"Set jpg quality to {quality}", sts);
|
||||||
|
|
||||||
|
if (!sts.IsSuccess)
|
||||||
|
{
|
||||||
|
sts = _twain.Caps.ICAP_JPEGQUALITY.Set(TWJQ.HIGH);
|
||||||
|
LogIt($"Set jpg quality to {TWJQ.HIGH}", sts);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
LogIt("");
|
||||||
|
}
|
||||||
|
|
||||||
|
const ushort TWQC_MACHINE = 0x1000;// applies to entire session/machine
|
||||||
|
const ushort TWQC_BITONAL = 0x2000; // applies to Bitonal "cameras"
|
||||||
|
const ushort TWQC_COLOR = 0x4000; // applies to Color "cameras"
|
||||||
|
[Flags]
|
||||||
|
public enum TWQC2 : ushort
|
||||||
|
{
|
||||||
|
MACHINE = 0x1000,
|
||||||
|
BITONAL = 0x2000,
|
||||||
|
COLOR = 0x4000
|
||||||
|
}
|
||||||
|
|
||||||
|
private string FlattenFlag(TWQC val)
|
||||||
|
{
|
||||||
|
StringBuilder sb = new();
|
||||||
|
|
||||||
|
foreach (var type in Enum.GetValues(typeof(TWQC)))
|
||||||
|
{
|
||||||
|
if (((ushort)val & (ushort)type) > 0)
|
||||||
|
{
|
||||||
|
sb.Append(type).Append(", ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
foreach (var type in Enum.GetValues(typeof(TWQC2)))
|
||||||
|
{
|
||||||
|
if (((ushort)val & (ushort)type) > 0)
|
||||||
|
{
|
||||||
|
sb.Append(type).Append(", ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (sb.Length > 0)
|
||||||
|
{
|
||||||
|
sb.Length = sb.Length - 2;
|
||||||
|
}
|
||||||
|
return sb.ToString();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void CaptureAsStandardScanner()
|
||||||
|
{
|
||||||
|
LogIt("Attempting Standard Scanner mode");
|
||||||
|
|
||||||
|
var sts = _twain.Caps.ICAP_PIXELTYPE.Set(TWPT.RGB);
|
||||||
|
LogIt("Set rgb pixel type", sts);
|
||||||
|
|
||||||
|
if (_twain.Caps.CAP_DUPLEXENABLED.Supports.HasFlag(TWQC.SET))
|
||||||
|
{
|
||||||
|
sts = _twain.Caps.CAP_DUPLEXENABLED.Set(TW_BOOL.True);
|
||||||
|
LogIt("Set duplex enabled", sts);
|
||||||
|
}
|
||||||
|
|
||||||
|
var dpi = listDpi.SelectedValue == null ? 300 : Convert.ToInt32(listDpi.SelectedValue);
|
||||||
|
sts = _twain.Caps.ICAP_XRESOLUTION.Set(dpi);
|
||||||
|
LogIt("Set x-resolution", sts);
|
||||||
|
sts = _twain.Caps.ICAP_YRESOLUTION.Set(dpi);
|
||||||
|
LogIt("Set y-resolution", sts);
|
||||||
|
|
||||||
|
if (listFormat.SelectedItem != null)
|
||||||
|
{
|
||||||
|
var format = (TWFF)listFormat.SelectedItem;
|
||||||
|
|
||||||
|
sts = _twain.Caps.ICAP_IMAGEFILEFORMAT.Set(format);
|
||||||
|
LogIt($"Set {format} format.", sts);
|
||||||
|
|
||||||
|
if (!sts.IsSuccess)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (format != TWFF.BMP)
|
||||||
|
{
|
||||||
|
if (_twain.Caps.ICAP_COMPRESSION.Supports.HasFlag(TWQC.SET))
|
||||||
|
{
|
||||||
|
sts = _twain.Caps.ICAP_COMPRESSION.Set(TWCP.JPEG);
|
||||||
|
LogIt("Set compression to jpg", sts);
|
||||||
|
if (sts.IsSuccess)
|
||||||
|
{
|
||||||
|
short quality = 90;
|
||||||
|
sts = _twain.Caps.ICAP_JPEGQUALITY.Set((TWJQ)quality);
|
||||||
|
LogIt($"Set jpg quality to {quality}", sts);
|
||||||
|
if (!sts.IsSuccess)
|
||||||
|
{
|
||||||
|
quality = 85;
|
||||||
|
sts = _twain.Caps.ICAP_JPEGQUALITY.Set((TWJQ)quality);
|
||||||
|
LogIt($"Set jpg quality to {quality}", sts);
|
||||||
|
|
||||||
|
if (!sts.IsSuccess)
|
||||||
|
{
|
||||||
|
sts = _twain.Caps.ICAP_JPEGQUALITY.Set(TWJQ.HIGH);
|
||||||
|
LogIt($"Set jpg quality to {TWJQ.HIGH}", sts);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
var limit = (short)boxLimit.Value;
|
||||||
|
sts = _twain.Caps.CAP_XFERCOUNT.Set(limit);
|
||||||
|
LogIt($"Set transfer limit {boxLimit.Value}", sts);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void btnStop_Click(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
_stopTransfer = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void btnBrowseFolder_Click(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
using FolderBrowserDialog dialog = new();
|
||||||
|
if (dialog.ShowDialog() == DialogResult.OK)
|
||||||
|
{
|
||||||
|
boxFolder.Text = dialog.SelectedPath;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void btnOpenFolder_Click(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
if (EnsureBoxFolder())
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
using var p = Process.Start("explorer.exe", boxFolder.Text);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private bool EnsureBoxFolder()
|
||||||
|
{
|
||||||
|
if (!string.IsNullOrEmpty(boxFolder.Text))
|
||||||
|
{
|
||||||
|
if (!Directory.Exists(boxFolder.Text))
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Directory.CreateDirectory(boxFolder.Text);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
LogIt($"Failed to ensure save folder: {ex.Message}");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
120
samples/ScannerTester/MainForm.resx
Normal file
120
samples/ScannerTester/MainForm.resx
Normal file
@@ -0,0 +1,120 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<root>
|
||||||
|
<!--
|
||||||
|
Microsoft ResX Schema
|
||||||
|
|
||||||
|
Version 2.0
|
||||||
|
|
||||||
|
The primary goals of this format is to allow a simple XML format
|
||||||
|
that is mostly human readable. The generation and parsing of the
|
||||||
|
various data types are done through the TypeConverter classes
|
||||||
|
associated with the data types.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
... ado.net/XML headers & schema ...
|
||||||
|
<resheader name="resmimetype">text/microsoft-resx</resheader>
|
||||||
|
<resheader name="version">2.0</resheader>
|
||||||
|
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||||
|
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
|
||||||
|
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
|
||||||
|
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||||
|
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||||
|
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||||
|
</data>
|
||||||
|
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
|
||||||
|
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
|
||||||
|
<comment>This is a comment</comment>
|
||||||
|
</data>
|
||||||
|
|
||||||
|
There are any number of "resheader" rows that contain simple
|
||||||
|
name/value pairs.
|
||||||
|
|
||||||
|
Each data row contains a name, and value. The row also contains a
|
||||||
|
type or mimetype. Type corresponds to a .NET class that support
|
||||||
|
text/value conversion through the TypeConverter architecture.
|
||||||
|
Classes that don't support this are serialized and stored with the
|
||||||
|
mimetype set.
|
||||||
|
|
||||||
|
The mimetype is used for serialized objects, and tells the
|
||||||
|
ResXResourceReader how to depersist the object. This is currently not
|
||||||
|
extensible. For a given mimetype the value must be set accordingly:
|
||||||
|
|
||||||
|
Note - application/x-microsoft.net.object.binary.base64 is the format
|
||||||
|
that the ResXResourceWriter will generate, however the reader can
|
||||||
|
read any of the formats listed below.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.binary.base64
|
||||||
|
value : The object must be serialized with
|
||||||
|
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.soap.base64
|
||||||
|
value : The object must be serialized with
|
||||||
|
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
|
||||||
|
mimetype: application/x-microsoft.net.object.bytearray.base64
|
||||||
|
value : The object must be serialized into a byte array
|
||||||
|
: using a System.ComponentModel.TypeConverter
|
||||||
|
: and then encoded with base64 encoding.
|
||||||
|
-->
|
||||||
|
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
|
||||||
|
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
|
||||||
|
<xsd:element name="root" msdata:IsDataSet="true">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:choice maxOccurs="unbounded">
|
||||||
|
<xsd:element name="metadata">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" />
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" use="required" type="xsd:string" />
|
||||||
|
<xsd:attribute name="type" type="xsd:string" />
|
||||||
|
<xsd:attribute name="mimetype" type="xsd:string" />
|
||||||
|
<xsd:attribute ref="xml:space" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="assembly">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:attribute name="alias" type="xsd:string" />
|
||||||
|
<xsd:attribute name="name" type="xsd:string" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="data">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||||
|
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
|
||||||
|
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
|
||||||
|
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
|
||||||
|
<xsd:attribute ref="xml:space" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
<xsd:element name="resheader">
|
||||||
|
<xsd:complexType>
|
||||||
|
<xsd:sequence>
|
||||||
|
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
|
||||||
|
</xsd:sequence>
|
||||||
|
<xsd:attribute name="name" type="xsd:string" use="required" />
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
</xsd:choice>
|
||||||
|
</xsd:complexType>
|
||||||
|
</xsd:element>
|
||||||
|
</xsd:schema>
|
||||||
|
<resheader name="resmimetype">
|
||||||
|
<value>text/microsoft-resx</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="version">
|
||||||
|
<value>2.0</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="reader">
|
||||||
|
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</resheader>
|
||||||
|
<resheader name="writer">
|
||||||
|
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
|
||||||
|
</resheader>
|
||||||
|
</root>
|
||||||
17
samples/ScannerTester/Program.cs
Normal file
17
samples/ScannerTester/Program.cs
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
namespace ScannerTester
|
||||||
|
{
|
||||||
|
internal static class Program
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// The main entry point for the application.
|
||||||
|
/// </summary>
|
||||||
|
[STAThread]
|
||||||
|
static void Main()
|
||||||
|
{
|
||||||
|
// To customize application configuration such as set high DPI settings or default font,
|
||||||
|
// see https://aka.ms/applicationconfiguration.
|
||||||
|
ApplicationConfiguration.Initialize();
|
||||||
|
Application.Run(new MainForm());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
17
samples/ScannerTester/ScannerTester.csproj
Normal file
17
samples/ScannerTester/ScannerTester.csproj
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<OutputType>WinExe</OutputType>
|
||||||
|
<TargetFramework>net8.0-windows</TargetFramework>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
|
<UseWindowsForms>true</UseWindowsForms>
|
||||||
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
|
<ApplicationManifest>app.manifest</ApplicationManifest>
|
||||||
|
<PlatformTarget>x86</PlatformTarget>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\..\src\NTwain\NTwain.csproj" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
|
</Project>
|
||||||
80
samples/ScannerTester/app.manifest
Normal file
80
samples/ScannerTester/app.manifest
Normal file
@@ -0,0 +1,80 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1">
|
||||||
|
<assemblyIdentity version="1.0.0.0" name="MyApplication.app"/>
|
||||||
|
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
|
||||||
|
<security>
|
||||||
|
<requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
|
||||||
|
<!-- UAC Manifest Options
|
||||||
|
If you want to change the Windows User Account Control level replace the
|
||||||
|
requestedExecutionLevel node with one of the following.
|
||||||
|
|
||||||
|
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
|
||||||
|
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
|
||||||
|
<requestedExecutionLevel level="highestAvailable" uiAccess="false" />
|
||||||
|
|
||||||
|
Specifying requestedExecutionLevel element will disable file and registry virtualization.
|
||||||
|
Remove this element if your application requires this virtualization for backwards
|
||||||
|
compatibility.
|
||||||
|
-->
|
||||||
|
<requestedExecutionLevel level="asInvoker" uiAccess="false" />
|
||||||
|
</requestedPrivileges>
|
||||||
|
</security>
|
||||||
|
</trustInfo>
|
||||||
|
|
||||||
|
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
|
||||||
|
<application>
|
||||||
|
<!-- A list of the Windows versions that this application has been tested on
|
||||||
|
and is designed to work with. Uncomment the appropriate elements
|
||||||
|
and Windows will automatically select the most compatible environment. -->
|
||||||
|
|
||||||
|
<!-- Windows Vista -->
|
||||||
|
<!--<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}" />-->
|
||||||
|
|
||||||
|
<!-- Windows 7 -->
|
||||||
|
<!--<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}" />-->
|
||||||
|
|
||||||
|
<!-- Windows 8 -->
|
||||||
|
<!--<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}" />-->
|
||||||
|
|
||||||
|
<!-- Windows 8.1 -->
|
||||||
|
<!--<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}" />-->
|
||||||
|
|
||||||
|
<!-- Windows 10 -->
|
||||||
|
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}" />
|
||||||
|
|
||||||
|
</application>
|
||||||
|
</compatibility>
|
||||||
|
|
||||||
|
<!-- Indicates that the application is DPI-aware and will not be automatically scaled by Windows at higher
|
||||||
|
DPIs. Windows Presentation Foundation (WPF) applications are automatically DPI-aware and do not need
|
||||||
|
to opt in. Windows Forms applications targeting .NET Framework 4.6 that opt into this setting, should
|
||||||
|
also set the 'EnableWindowsFormsHighDpiAutoResizing' setting to 'true' in their app.config.
|
||||||
|
|
||||||
|
Makes the application long-path aware. See https://docs.microsoft.com/windows/win32/fileio/maximum-file-path-limitation -->
|
||||||
|
|
||||||
|
<application xmlns="urn:schemas-microsoft-com:asm.v3">
|
||||||
|
<windowsSettings>
|
||||||
|
<dpiAware xmlns="http://schemas.microsoft.com/SMI/2005/WindowsSettings">true/pm</dpiAware>
|
||||||
|
<dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitorV2,PerMonitor</dpiAwareness>
|
||||||
|
<longPathAware xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">true</longPathAware>
|
||||||
|
</windowsSettings>
|
||||||
|
</application>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- Enable themes for Windows common controls and dialogs (Windows XP and later) -->
|
||||||
|
|
||||||
|
<dependency>
|
||||||
|
<dependentAssembly>
|
||||||
|
<assemblyIdentity
|
||||||
|
type="win32"
|
||||||
|
name="Microsoft.Windows.Common-Controls"
|
||||||
|
version="6.0.0.0"
|
||||||
|
processorArchitecture="*"
|
||||||
|
publicKeyToken="6595b64144ccf1df"
|
||||||
|
language="*"
|
||||||
|
/>
|
||||||
|
</dependentAssembly>
|
||||||
|
</dependency>
|
||||||
|
|
||||||
|
|
||||||
|
</assembly>
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
using NTwain;
|
using NTwain;
|
||||||
using NTwain.Data;
|
using NTwain.Data;
|
||||||
|
using NTwain.Data.KDS;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
|
|
||||||
namespace WinConsole32
|
namespace WinConsole32
|
||||||
@@ -76,7 +77,7 @@ namespace WinConsole32
|
|||||||
{
|
{
|
||||||
if (e.ImgXferMech == TWSX.FILE)
|
if (e.ImgXferMech == TWSX.FILE)
|
||||||
{
|
{
|
||||||
var req = TW_EXTIMAGEINFO.CreateRequest(TWEI.CAMERA, TWEI.HDR_PAGENUMBER, TWEI.HDR_COMPRESSION);
|
var req = TW_EXTIMAGEINFO.CreateRequest(TWEI.CAMERA, (TWEI)KDS_TWEI.HDR_PAGENUMBER, (TWEI)KDS_TWEI.HDR_COMPRESSION);
|
||||||
e.GetExtendedImageInfo(ref req);
|
e.GetExtendedImageInfo(ref req);
|
||||||
|
|
||||||
string? camera = null;
|
string? camera = null;
|
||||||
@@ -90,10 +91,10 @@ namespace WinConsole32
|
|||||||
case TWEI.CAMERA:
|
case TWEI.CAMERA:
|
||||||
camera = ei.ReadHandleString(twain);
|
camera = ei.ReadHandleString(twain);
|
||||||
break;
|
break;
|
||||||
case TWEI.HDR_PAGENUMBER:
|
case (TWEI)KDS_TWEI.HDR_PAGENUMBER:
|
||||||
pageNum = ei.ReadNonPointerData<int>();
|
pageNum = ei.ReadNonPointerData<int>();
|
||||||
break;
|
break;
|
||||||
case TWEI.HDR_COMPRESSION:
|
case (TWEI)KDS_TWEI.HDR_COMPRESSION:
|
||||||
comp = ei.ReadNonPointerData<TWCP>();
|
comp = ei.ReadNonPointerData<TWCP>();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<!--change these in each release-->
|
<!--change these in each release-->
|
||||||
<VersionPrefix>4.0.0.0</VersionPrefix>
|
<VersionPrefix>4.0.0.0</VersionPrefix>
|
||||||
<VersionSuffix>alpha.9</VersionSuffix>
|
<VersionSuffix>alpha.10</VersionSuffix>
|
||||||
|
|
||||||
<!--keep it the same until major # changes-->
|
<!--keep it the same until major # changes-->
|
||||||
<AssemblyVersion>4.0.0.0</AssemblyVersion>
|
<AssemblyVersion>4.0.0.0</AssemblyVersion>
|
||||||
@@ -19,7 +19,7 @@
|
|||||||
<Copyright>Eugene Wang 2012-2025</Copyright>
|
<Copyright>Eugene Wang 2012-2025</Copyright>
|
||||||
<Authors>Eugene Wang</Authors>
|
<Authors>Eugene Wang</Authors>
|
||||||
|
|
||||||
<LangVersion>11</LangVersion>
|
<LangVersion>12</LangVersion>
|
||||||
<!--don't warn missing xml docs, naming conventions, and suppressions-->
|
<!--don't warn missing xml docs, naming conventions, and suppressions-->
|
||||||
<NoWarn>1591,IDE1006,IDE0079</NoWarn>
|
<NoWarn>1591,IDE1006,IDE0079</NoWarn>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|||||||
3952
src/NTwain/Data/KDS/KDSCUSTH.cs
Normal file
3952
src/NTwain/Data/KDS/KDSCUSTH.cs
Normal file
File diff suppressed because it is too large
Load Diff
258
src/NTwain/Data/KDS/KDS_CAP.cs
Normal file
258
src/NTwain/Data/KDS/KDS_CAP.cs
Normal file
@@ -0,0 +1,258 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace NTwain.Data.KDS;
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Custom CAP types for Kodak DS.
|
||||||
|
/// </summary>
|
||||||
|
public enum KDS_CAP : ushort
|
||||||
|
{
|
||||||
|
CAP_FEEDERKEEPALIVE = 0x8001,
|
||||||
|
CAP_PAGESIZELIMIT = 0x8002,
|
||||||
|
CAP_TRANSPORTTIMEOUT = 0x8003,
|
||||||
|
CAP_WINDOWPOSITION = 0x8004,
|
||||||
|
ICAP_LAMPSAVER = 0x8005,
|
||||||
|
ICAP_OVERSCANX = 0x8006,
|
||||||
|
ICAP_OVERSCANY = 0x8007,
|
||||||
|
ICAP_FORCECOMPRESSION = 0x8008,
|
||||||
|
CAP_PRINTERWRITESEQUENCESTRING = 0x8009,
|
||||||
|
CAP_PRINTERWRITESEQUENCESPACE = 0x800A,
|
||||||
|
CAP_PRINTERWRITESEQUENCESPACESTRING = 0x800B,
|
||||||
|
CAP_PRINTERWRITESEQUENCEMESSAGE1 = 0x800C,
|
||||||
|
CAP_PRINTERWRITESEQUENCEMESSAGE2 = 0x800D,
|
||||||
|
CAP_PRINTERWRITESEQUENCEMESSAGE3 = 0x800E,
|
||||||
|
CAP_PRINTERWRITESEQUENCEMESSAGE4 = 0x800F,
|
||||||
|
CAP_PRINTERWRITESEQUENCEMESSAGE5 = 0x8010,
|
||||||
|
CAP_PRINTERWRITESEQUENCEMESSAGE6 = 0x8011,
|
||||||
|
CAP_PRINTERWRITESEQUENCEMESSAGE7 = 0x8012,
|
||||||
|
CAP_PRINTERWRITESEQUENCEMESSAGE8 = 0x8013,
|
||||||
|
CAP_PRINTERWRITESEQUENCEMESSAGE9 = 0x8014,
|
||||||
|
CAP_IMAGEADDRESS = 0x8015,
|
||||||
|
CAP_IMAGEADDRESSENABLED = 0x8016,
|
||||||
|
CAP_DOCUMENTCOUNT = 0x8017,
|
||||||
|
CAP_DOCUMENTCOUNTENABLED = 0x8018,
|
||||||
|
CAP_MODE = 0x8019,
|
||||||
|
CAP_PRINTERINDEXFORMAT = 0x801A,
|
||||||
|
CAP_PRINTERINDEXDIGITS = 0x801B,
|
||||||
|
CAP_PRINTERDATEDELIMITER = 0x801C,
|
||||||
|
CAP_CAMERAENABLE = 0x801D,
|
||||||
|
CAP_CAMERAORDER = 0x801E,
|
||||||
|
ICAP_HALFTONESQUALITY = 0x801F,
|
||||||
|
ICAP_COLORTABLE = 0x8020,
|
||||||
|
ICAP_VERTICALBLACKLINEREMOVAL = 0x8021,
|
||||||
|
ICAP_CROPPINGMODE = 0x8022,
|
||||||
|
ICAP_ADDBORDER = 0x8023,
|
||||||
|
ICAP_FILTERENUM = 0x8024,
|
||||||
|
ICAP_FILTERTHRESHOLD = 0x8025,
|
||||||
|
ICAP_FILTERBACKGROUND = 0x8026,
|
||||||
|
CAP_ULTRASONICSENSITIVITY = 0x8027,
|
||||||
|
CAP_TRANSPORTTIMEOUTRESPONSE = 0x8028,
|
||||||
|
CAP_TRANSPORTAUTOSTART = 0x8029,
|
||||||
|
ICAP_LAMPTIMEOUT = 0x802A,
|
||||||
|
CAP_BATCHCOUNT = 0x802B,
|
||||||
|
CAP_PAPERSOURCE = 0x802C,
|
||||||
|
CAP_MULTIFEEDSOUND = 0x802D,
|
||||||
|
ICAP_GRAYSCALE = 0x802E,
|
||||||
|
CAP_ENERGYSTAR = 0x802F,
|
||||||
|
CAP_BINARIZATION = 0x8030,
|
||||||
|
CAP_PAGECOUNT = 0x8031,
|
||||||
|
CAP_NOWAIT = 0x8032,
|
||||||
|
CAP_PRINTERDATEFORMAT = 0x8033,
|
||||||
|
CAP_PRINTERWRITESEQUENCEMESSAGE10 = 0x8034,
|
||||||
|
CAP_PRINTERWRITESEQUENCEMESSAGE11 = 0x8035,
|
||||||
|
CAP_PRINTERWRITESEQUENCEMESSAGE12 = 0x8036,
|
||||||
|
CAP_FUNCTIONKEY1 = 0x8037,
|
||||||
|
CAP_FUNCTIONKEY2 = 0x8038,
|
||||||
|
CAP_FUNCTIONKEY3 = 0x8039,
|
||||||
|
CAP_FUNCTIONKEY4 = 0x803A,
|
||||||
|
CAP_LEVELTOFOLLOW1 = 0x803B,
|
||||||
|
CAP_LEVELTOFOLLOW2 = 0x803C,
|
||||||
|
CAP_LEVELTOFOLLOW3 = 0x803D,
|
||||||
|
CAP_IMAGEADDRESSTEMPLATES = 0x803E,
|
||||||
|
CAP_BATCHSTARTFUNCTION = 0x803F,
|
||||||
|
OBS_JPEGQUALITY = 0x8040,
|
||||||
|
ICAP_COLORSHARPENING = 0x8041,
|
||||||
|
ICAP_FRAMELENGTHCONTROL = 0x8042,
|
||||||
|
ICAP_FLIPBACKGROUNDCOLOR = 0x8043,
|
||||||
|
CAP_PRINTERFONT = 0x8044,
|
||||||
|
CAP_PRINTERIMAGEADDRESSFORMAT = 0x8045,
|
||||||
|
CAP_PRINTERPOSITION = 0x8046,
|
||||||
|
CAP_PRINTERIMAGEADDRESSLEVEL = 0x8047,
|
||||||
|
CAP_PRINTERWRITESEQUENCEINDEX = 0x8048,
|
||||||
|
CAP_PRINTERWRITESEQUENCE = 0x8049,
|
||||||
|
CAP_IMAGEADDRESS_A = 0x804A,
|
||||||
|
CAP_IMAGEADDRESS_B = 0x804B,
|
||||||
|
CAP_IMAGEADDRESS_C = 0x804C,
|
||||||
|
CAP_IMAGEADDRESS_D = 0x804D,
|
||||||
|
CAP_BATCHLEVEL = 0x804E,
|
||||||
|
CAP_BATCHENDFUNCTION = 0x804F,
|
||||||
|
// Reserved 0x8050 - 0x8053,
|
||||||
|
CAP_ENABLECOLORPATCHCODE = 0x8054,
|
||||||
|
CAP_FIXEDDOCUMENTSIZE = 0x8055,
|
||||||
|
CAP_DOUBLEFEEDSTOP = 0x8056,
|
||||||
|
CAP_MULTIFEEDTHICKNESSDETECTION = 0x8057,
|
||||||
|
// Reserved 0x8058 - 0x8069,
|
||||||
|
CAP_PCARDENABLED = 0x806A,
|
||||||
|
CAP_IMAGEMAGNIFICATIONFACTOR = 0x806B,
|
||||||
|
CAP_INDICATORSWARMUP = 0x806C,
|
||||||
|
CAP_TOGGLEPATCH = 0x806D,
|
||||||
|
CAP_DOUBLEFEEDENDJOB = 0x806E,
|
||||||
|
CAP_FEEDERMODE = 0x806F,
|
||||||
|
CAP_FOLDEDCORNER = 0x8070,
|
||||||
|
CAP_FOLDEDCORNERSENSITIVITY = 0x8071,
|
||||||
|
ICAP_GAMMAENABLED = 0x8074,
|
||||||
|
CAP_EASYSTACKING = 0x8075,
|
||||||
|
// Reserved 0x8076 - 0x8085,
|
||||||
|
CAP_MULTIFEEDCOUNT = 0x8086,
|
||||||
|
CAP_PATCHCOUNT = 0x8087,
|
||||||
|
ICAP_FILTERPROCESSING = 0x8088,
|
||||||
|
CAP_BACKGROUND = 0x8089,
|
||||||
|
CAP_PRINTERWRITESEQUENCEMESSAGEINDEX = 0x808A,
|
||||||
|
CAP_CHECKDIGIT = 0x808B,
|
||||||
|
CAP_BACKGROUNDFRONT = 0x808C,
|
||||||
|
CAP_BACKGROUNDREAR = 0x808D,
|
||||||
|
CAP_BACKGROUNDPLATEN = 0x808E,
|
||||||
|
CAP_ULTRASONICSENSORCENTER = 0x808F,
|
||||||
|
CAP_ULTRASONICSENSORLEFT = 0x8090,
|
||||||
|
CAP_ULTRASONICSENSORRIGHT = 0x8091,
|
||||||
|
ICAP_AUTOCOLORAMOUNT = 0x8092,
|
||||||
|
ICAP_AUTOCOLORCONTENT = 0x8093,
|
||||||
|
ICAP_AUTOCOLORTHRESHOLD = 0x8094,
|
||||||
|
ICAP_IMAGEEDGEFILL = 0x8095,
|
||||||
|
ICAP_IMAGEEDGELEFT = 0x8096,
|
||||||
|
ICAP_IMAGEEDGERIGHT = 0x8097,
|
||||||
|
ICAP_IMAGEEDGETOP = 0x8098,
|
||||||
|
ICAP_IMAGEEDGEBOTTOM = 0x8099,
|
||||||
|
CAP_BLANKPAGE = 0x809A,
|
||||||
|
CAP_BLANKPAGEMODE = 0x809B,
|
||||||
|
CAP_BLANKPAGECOMPSIZEBW = 0x809C,
|
||||||
|
CAP_BLANKPAGECOMPSIZEGRAY = 0x809D,
|
||||||
|
CAP_BLANKPAGECOMPSIZERGB = 0x809E,
|
||||||
|
CAP_PROFILES = 0x809F,
|
||||||
|
ICAP_ANSELBRIGHTNESS = 0x80A0,
|
||||||
|
ICAP_ANSELCONTRAST = 0x80A1,
|
||||||
|
ICAP_ANSELHIGHLIGHT = 0x80A2,
|
||||||
|
ICAP_ANSELMIDTONE = 0x80A3,
|
||||||
|
ICAP_ANSELREMOVEREDEYE = 0x80A4,
|
||||||
|
ICAP_ANSELRESTORECOLOR = 0x80A5,
|
||||||
|
ICAP_ANSELSATURATECOLORS = 0x80A6,
|
||||||
|
ICAP_ANSELSHADOW = 0x80A7,
|
||||||
|
ICAP_ANSELSHARPENIMAGE = 0x80A8,
|
||||||
|
ICAP_ANSELSHASTA = 0x80A9,
|
||||||
|
ICAP_PADDING = 0x80AA,
|
||||||
|
ICAP_NEWWINDOWSIZE = 0x80AB,
|
||||||
|
ICAP_DOCUMENTTYPE = 0x80AC,
|
||||||
|
CAP_WINDOW = 0x80AD,
|
||||||
|
ICAP_BACKGROUNDADJUSTMODE = 0x80AE,
|
||||||
|
ICAP_BACKGROUNDADJUSTAPPLYTO = 0x80AF,
|
||||||
|
ICAP_BACKGROUNDADJUSTAGGRESSIVENESS = 0x80B0,
|
||||||
|
ICAP_COLORBALANCEBLUE = 0x80B1,
|
||||||
|
ICAP_COLORBALANCEGREEN = 0x80B2,
|
||||||
|
ICAP_COLORBALANCERED = 0x80B3,
|
||||||
|
CAP_WINDOWCAMERA = 0x80B4,
|
||||||
|
ICAP_SKEWANGLE = 0x80B5,
|
||||||
|
ICAP_MEDIATYPE = 0x80B6,
|
||||||
|
CAP_SIDESDIFFERENT = 0x80B7,
|
||||||
|
ICAP_ECDO = 0x80B8,
|
||||||
|
ICAP_IMAGEEDGEFILLALLSIDES = 0x80B9,
|
||||||
|
CAP_MULTIFEEDRESPONSE = 0x80BA,
|
||||||
|
ICAP_FRAMESANGLE = 0x80BB,
|
||||||
|
CAP_PRINTERDATE = 0x80BC,
|
||||||
|
CAP_PRINTERTIME = 0x80BD,
|
||||||
|
CAP_PRINTERFONTFORMAT = 0x80BE,
|
||||||
|
CAP_PATCHHEAD1 = 0x80BF,
|
||||||
|
CAP_PATCHHEAD2 = 0x80C0,
|
||||||
|
CAP_PATCHHEAD3 = 0x80C1,
|
||||||
|
CAP_PATCHHEAD4 = 0x80C2,
|
||||||
|
ICAP_ECDOTREATASCOLOR = 0x80C3,
|
||||||
|
CAP_BLANKPAGECONTENT = 0x80C4,
|
||||||
|
CAP_IMAGEMERGE = 0x80C5,
|
||||||
|
ICAP_STREAKREMOVALENABLED = 0x80C6,
|
||||||
|
ICAP_STREAKREMOVALAGGRESSIVENESS = 0x80C7,
|
||||||
|
// Reserved 0x80C8 - 0x80FF,
|
||||||
|
CAP_IMAGESDIFFERENT = 0x8100,
|
||||||
|
ICAP_PHYSICALHEIGHTADJUST = 0x8101,
|
||||||
|
ICAP_COLORSHARPEN = 0x8102,
|
||||||
|
ICAP_ECDOAGGRESSIVENESS = 0x8103,
|
||||||
|
ICAP_HOLEFILLENABLED = 0x8104,
|
||||||
|
CAP_ULTRASONICSENSORLEFTCENTER = 0x8105,
|
||||||
|
CAP_ULTRASONICSENSORRIGHTCENTER = 0x8106,
|
||||||
|
CAP_ULTRASONICSENSORZONEHEIGHT = 0x8107,
|
||||||
|
ICAP_COLORBRIGHTNESSMODE = 0x8108,
|
||||||
|
ICAP_COLORBALANCEMODE = 0x8109,
|
||||||
|
ICAP_COLORBALANCEAUTOMATICAGGRESSIVENESS = 0x810A,
|
||||||
|
CAP_SIMULATING = 0x810B,
|
||||||
|
CAP_POWEROFFTIMEOUT = 0x810C,
|
||||||
|
CAP_INTELLIGENTDOCUMENTPROTECTION = 0x810D,
|
||||||
|
ICAP_FOREGROUNDBOLDNESSAGGRESSIVENESS = 0x810E,
|
||||||
|
ICAP_FOREGROUNDBOLDNESSMODE = 0x810F,
|
||||||
|
CAP_DUALSTACKINGENABLED = 0x8110,
|
||||||
|
CAP_DUALSTACKINGLENGTHMODE = 0x8111,
|
||||||
|
CAP_DUALSTACKINGLENGTH1 = 0x8112,
|
||||||
|
CAP_DUALSTACKINGLENGTH2 = 0x8113,
|
||||||
|
CAP_DUALSTACKINGMULTIFEED = 0x8114,
|
||||||
|
CAP_DUALSTACKINGPATCHTRANSFER = 0x8115,
|
||||||
|
CAP_DUALSTACKINGPATCHTYPE1 = 0x8116,
|
||||||
|
CAP_DUALSTACKINGPATCHTYPE2 = 0x8117,
|
||||||
|
CAP_DUALSTACKINGPATCHTYPE3 = 0x8118,
|
||||||
|
CAP_DUALSTACKINGPATCHTYPE4 = 0x8119,
|
||||||
|
CAP_DUALSTACKINGPATCHTYPE6 = 0x811A,
|
||||||
|
CAP_DUALSTACKINGSTACK = 0x811B,
|
||||||
|
CAP_INDEXINGFORMAT = 0x811C,
|
||||||
|
CAP_CARTRIDGEDETECTED = 0x811D,
|
||||||
|
ICAP_BARCODECOUNT = 0x811E,
|
||||||
|
ICAP_BARCODEENHANCEMENT = 0x811F,
|
||||||
|
ICAP_BARCODESEARCHAREA = 0x8120,
|
||||||
|
ICAP_BARCODESEARCHREGION = 0x8121,
|
||||||
|
ICAP_TEXTENHANCEMENT = 0x8122,
|
||||||
|
ICAP_THINTHICKENAMOUNT = 0x8123,
|
||||||
|
CAP_POWEROFFTIMEOUTENABLED = 0x8124,
|
||||||
|
CAP_PAPERJAMRESPONSE = 0x8125,
|
||||||
|
CAP_PRINTERTIMEFORMAT = 0x8126,
|
||||||
|
CAP_PRINTERINDEXINCREMENT = 0x8127,
|
||||||
|
CAP_PRINTERINDEXRESET = 0x8128,
|
||||||
|
CAP_PRINTERINDEXRESETVALUE = 0x8129,
|
||||||
|
CAP_PRINTONIMAGEFRONT = 0x812A,
|
||||||
|
CAP_PRINTONIMAGEREAR = 0x812B,
|
||||||
|
CAP_PRINTONIMAGEPOSITIONX = 0x812C,
|
||||||
|
CAP_PRINTONIMAGEPOSITIONY = 0x812D,
|
||||||
|
ICAP_ECDOINCLUDENONDROPPED = 0x812E,
|
||||||
|
CAP_PATCHTYPE10 = 0x812F,
|
||||||
|
CAP_PATCHTYPE11 = 0x8130,
|
||||||
|
CAP_PATCHTYPE12 = 0x8131,
|
||||||
|
CAP_PATCHTYPE13 = 0x8132,
|
||||||
|
CAP_PATCHTYPE14 = 0x8133,
|
||||||
|
CAP_PATCHTYPE15 = 0x8134,
|
||||||
|
CAP_INDEXINGDOCUMENT = 0x8135,
|
||||||
|
CAP_INDEXINGSHEET = 0x8136,
|
||||||
|
CAP_INDEXINGPRINTONPATCH = 0x8137,
|
||||||
|
CAP_PRINTERFONTRESIZE = 0x8138,
|
||||||
|
CAP_DUALSTACKINGPATCHTYPE10 = 0x8139,
|
||||||
|
CAP_DUALSTACKINGPATCHTYPE11 = 0x813A,
|
||||||
|
CAP_DUALSTACKINGPATCHTYPE12 = 0x813B,
|
||||||
|
CAP_DUALSTACKINGPATCHTYPE13 = 0x813C,
|
||||||
|
CAP_DUALSTACKINGPATCHTYPE14 = 0x813D,
|
||||||
|
CAP_DUALSTACKINGPATCHTYPE15 = 0x813E,
|
||||||
|
CAP_PAPERDESTINATION = 0x813F,
|
||||||
|
CAP_ACTIVEFEED = 0x8140,
|
||||||
|
CAP_ENHANCEDSEPARATION = 0x8141,
|
||||||
|
CAP_FLATBEDMULTIDOCLOCATE = 0x8142,
|
||||||
|
CAP_SLEEVEMULTIDOCLOCATE = 0x8143,
|
||||||
|
CAP_SLEEVEDOCUMENT = 0x8144,
|
||||||
|
CAP_SPLITDOCUMENTCOUNT = 0x8145,
|
||||||
|
CAP_SPLITDOCUMENTLENGTHMODE = 0x8146,
|
||||||
|
CAP_SPLITDOCUMENTLENGTH1 = 0x8147,
|
||||||
|
CAP_SPLITDOCUMENTLENGH2 = 0x8148,
|
||||||
|
CAP_KADIGITALSTAMPINGSUPPORTED = 0x8149,
|
||||||
|
ICAP_AUTOCOLORIGNOREBACKGROUND = 0x814A,
|
||||||
|
CAP_SNAPTOSIZEENABLED = 0x814B,
|
||||||
|
CAP_SNAPTOSIZE = 0x814C,
|
||||||
|
ICAP_IMAGEROTATEORTHOGONALCHARSET = 0x814D,
|
||||||
|
CAP_KADIGITALSTAMPCOUNT = 0x814E,
|
||||||
|
CAP_KAEKLOGUSESZIP = 0x814F,
|
||||||
|
}
|
||||||
25
src/NTwain/Data/KDS/KDS_DAT.cs
Normal file
25
src/NTwain/Data/KDS/KDS_DAT.cs
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace NTwain.Data.KDS;
|
||||||
|
|
||||||
|
public enum KDS_DAT : ushort
|
||||||
|
{
|
||||||
|
STATUSRAW = 0x8001,
|
||||||
|
PCARD = 0x8002,
|
||||||
|
COLORTABLEMAP = 0x8003,
|
||||||
|
DEVICEINFO = 0x8005,
|
||||||
|
AUTOCOLORLEARN = 0x8006,
|
||||||
|
PROFILES = 0x8007,
|
||||||
|
WINDOW = 0x8008,
|
||||||
|
CUSTOMDSDATAGROUP = 0x8009,
|
||||||
|
ECDO = 0x800A,
|
||||||
|
QUERYSUPPORT = 0x800B,
|
||||||
|
LOG = 0x800C,
|
||||||
|
UTC = 0x800D,
|
||||||
|
OCPBUTTONS = 0x800E,
|
||||||
|
CONSUMABLEMETERS = 0x8010
|
||||||
|
}
|
||||||
39
src/NTwain/Data/KDS/KDS_MSG.cs
Normal file
39
src/NTwain/Data/KDS/KDS_MSG.cs
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace NTwain.Data.KDS;
|
||||||
|
|
||||||
|
public enum KDS_MSG : ushort
|
||||||
|
{
|
||||||
|
SETUPDS = 0x8002,
|
||||||
|
DISABLEUI = 0x8003,
|
||||||
|
ENABLEUI = 0x8004,
|
||||||
|
GETSPECIAL = 0x8005,
|
||||||
|
ENABLESCANNER = 0x8006,
|
||||||
|
/// <summary>
|
||||||
|
/// Deprecated TWAIN 10.x+
|
||||||
|
/// </summary>
|
||||||
|
SAVEPROFILE = 0x8008,
|
||||||
|
/// <summary>
|
||||||
|
/// Deprecated TWAIN 10.x+
|
||||||
|
/// </summary>
|
||||||
|
DELETEPROFILE = 0x8009,
|
||||||
|
// Reserved =0x8007, =0x800A - =0x8010, =0x8013 - =0x8014, =0x801F
|
||||||
|
ADDWINDOW = 0x8011,
|
||||||
|
DELETEWINDOW = 0x8012,
|
||||||
|
PROFILECREATE = 0x8015,
|
||||||
|
PROFILEDELETE = 0x8016,
|
||||||
|
PROFILESAVE = 0x8017,
|
||||||
|
PROFILERENAME = 0x8018,
|
||||||
|
PROFILERESTORE = 0x8019,
|
||||||
|
PROFILEEXPORT = 0x801A,
|
||||||
|
PROFILEIMPORT = 0x801B,
|
||||||
|
PROFILESET = 0x801C,
|
||||||
|
GETINQUIRY = 0x801D,
|
||||||
|
ENDXFERSPECIAL = 0x801E,
|
||||||
|
RESOURCELOCK = 0x801F,
|
||||||
|
RESOURCEUNLOCK = 0x8020
|
||||||
|
}
|
||||||
82
src/NTwain/Data/KDS/KDS_TWEI.cs
Normal file
82
src/NTwain/Data/KDS/KDS_TWEI.cs
Normal file
@@ -0,0 +1,82 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace NTwain.Data.KDS;
|
||||||
|
public enum KDS_TWEI : ushort
|
||||||
|
{
|
||||||
|
HDR_PAGESIDE = 0x8001, // 0-front 1-rear
|
||||||
|
HDR_DOCUMENTCOUNT = 0x8002, // Count of pages (seeded by user)
|
||||||
|
HDR_LENGTH = 0x8003, // Number of bytes of image data
|
||||||
|
HDR_LEVEL = 0x8004, // Image Address Level
|
||||||
|
HDR_MODE = 0x8005, // Gemini Mode (1-18)
|
||||||
|
HDR_LINELENGTH = 0x8006, // Width
|
||||||
|
HDR_PAGELENGTH = 0x8007, // Height
|
||||||
|
HDR_COMPRESSION = 0x8008, // ICAP_COMPRESSION TWCP_* value
|
||||||
|
HDR_DATE = 0x8009, // YY/MM/DD
|
||||||
|
HDR_TIME = 0x800A, // HH/MM/00
|
||||||
|
HDR_ROLL = 0x800B, // Imagelink 990 Film Roll Number
|
||||||
|
HDR_RESOLUTION = 0x800C, // Dots Per Inch (DPI)
|
||||||
|
HDR_BITORDER = 0x800D, // Bit order in a byte
|
||||||
|
HDR_SKEW = 0x800E, // (obsolete)
|
||||||
|
HDR_MOMENTARYFLAG = 0x800F, // Gemini Momentary
|
||||||
|
HDR_LATCHEDFLAG = 0x8010, // Gemini Latched
|
||||||
|
HDR_BARCODE = 0x8011, // Gemini Barcode(s)
|
||||||
|
HDR_DESKEW = 0x8012, // Deskew status
|
||||||
|
HDR_DESKEWANGLE = 0x8013, // Deskew angle
|
||||||
|
HDR_POLARITY = 0x8014, // ICAP_PIXELFLAVOR TWPF_* value
|
||||||
|
HDR_PRINTERSTRING = 0x8015, // Viper/Prism/Wildfire printed string
|
||||||
|
HDR_PRINTERINDEX = 0x8016, // Kinda like the document count
|
||||||
|
HDR_IMAGENUMBER = 0x8017, // Count images this session
|
||||||
|
HDR_PAGENUMBER = 0x8018, // Count sheets of paper this session
|
||||||
|
HDR_PAGEIMAGENUMBER = 0x8019, // Image count on a page (1 - 4)
|
||||||
|
HDR_BOOKNAME_A = 0x801A, // Fixed field Gemini/Prism/Wildfire A
|
||||||
|
HDR_BOOKNAME_B = 0x801B, // Fixed field Prism/Wildfire B
|
||||||
|
HDR_BOOKNAME_C = 0x801C, // Fixed field Prism/Wildfire C
|
||||||
|
HDR_BOOKNAME_D = 0x801D, // Fixed field Prism/Wildfire D
|
||||||
|
HDR_IMAGEADDRESSSTRING = 0x801E, // Prism/Wildfire image address string
|
||||||
|
HDR_XOFFSET = 0x801F, // Left cropping offset
|
||||||
|
HDR_YOFFSET = 0x8020, // Right cropping offset
|
||||||
|
HDR_FEATUREPATCH = 0x8021, // Feature patch (only image with patch: i200/i600)
|
||||||
|
HDR_IMAGEADDRESSDEFS = 0x8022, // Image Address field definitions
|
||||||
|
HDR_PCARD_HEADER = 0x8023, // Personality-Card Header
|
||||||
|
HDR_PCARD_FOOTER = 0x8024, // Personality-Card Footer
|
||||||
|
HDR_TOKEN_COUNT = 0x8025, // Alien token flag
|
||||||
|
HDR_REGENERATION = 0x8026, // Alien retry count
|
||||||
|
HDR_IMAGESTATUS = 0x8027, // Alien image status
|
||||||
|
HDR_DITHER = 0x8028, // Bitonal dithering algorithm used
|
||||||
|
HDR_PATCHDETECTED = 0x8029, // Patch was found on the document
|
||||||
|
HDR_FOLDEDCORNERPERCENTAGE = 0x802A, // Phoenix folded corner percentage
|
||||||
|
HDR_DESKEWCONFIDENCEFACTOR = 0x802B, // Phoenix deskew confidence factor
|
||||||
|
HDR_BITONALCONTRASTPERCENTAGE = 0x802C, // Phoenix bitonal contrast percentage
|
||||||
|
HDR_BITONALCONTRAST = 0x802D, // Phoenix bitonal contrast
|
||||||
|
HDR_BITONALTHRESHOLD = 0x802E, // Phoenix bitonal threshold
|
||||||
|
HDR_SUMHISTOGRAM = 0x802F, // Phoenix sum historgram
|
||||||
|
HDR_DIFFERENCEHISTOGRAM = 0x8030, // Phoenix difference histogram
|
||||||
|
HDR_GAMMATABLE = 0x8031, // Phoenix gamma table
|
||||||
|
HDR_MULTIFEED = 0x8032, // Multifeed detected
|
||||||
|
HDR_DESKEWANGLEACTUAL = 0x8033, // Signed deskew angle to scanner precision
|
||||||
|
HDR_RAWIMAGEHEADER = 0x8034, // Raw image header from scanner
|
||||||
|
HDR_LONGPAPERSEGMENT = 0x8035, // Long paper segment number
|
||||||
|
HDR_LONGPAPERLASTSEGMENT = 0x8036, // Long pager last segment
|
||||||
|
HDR_AUTOCOLORDETECTED = 0x8037, // Auto color detected
|
||||||
|
HDR_AUTOCOLORAMOUNT = 0x8038, // Auto color amount
|
||||||
|
HDR_AUTOCOLORTHRESHOLD = 0x8039, // Auto color threshold
|
||||||
|
HDR_XML = 0x803A, // <reportimage> data in XML format (see sample at end of file)
|
||||||
|
HDR_DROPOUTSTATUS = 0x803B, // ECDO Algorithm Status
|
||||||
|
HDR_PROCESSINGSTATUS = 0x803C, // Processing Status
|
||||||
|
HDR_BINARIZATIONQUALITY = 0x803D, // Conveys the quality level of the binarized image
|
||||||
|
HDR_DUALSTACKINGSTACK = 0x803E, // Which output tray a document was dropped into (i5000 only)
|
||||||
|
// Only valid if dual stacking is enabled; legal values are 1 and 2
|
||||||
|
HDR_PAPERDESTINATION = 0x803F, // Which output tray a document
|
||||||
|
// was dropped into (i5000 only)
|
||||||
|
HDR_SLEEVETYPE = 0x8040, // Type of sleeve that was detected during Sleeve Scanning
|
||||||
|
HDR_MULTIIMAGEINDEX = 0x8041, // Image ID for the image that was split from a document
|
||||||
|
HDR_MULTIIMAGETOTAL = 0x8042, // Total number of images split from a document
|
||||||
|
HDR_ENDOFSHEET = 0x8043, // Is this the last image on this sheet? (0-no or 1-yes)
|
||||||
|
HDR_STAMPEDSTRING = 0x8044, // Stamped string
|
||||||
|
HDR_STAMPCOUNT = 0x8045, // Digital Stamping Counter
|
||||||
|
|
||||||
|
}
|
||||||
17
src/NTwain/Data/KDS/KDS_TWRC.cs
Normal file
17
src/NTwain/Data/KDS/KDS_TWRC.cs
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
|
namespace NTwain.Data.KDS;
|
||||||
|
|
||||||
|
public enum KDS_TWRC : ushort
|
||||||
|
{
|
||||||
|
BUSY = 0x8001,
|
||||||
|
PCARD_CHECKSTATUS = 0x8002,
|
||||||
|
PCARD_FATAL = 0x8003,
|
||||||
|
PCARD_RETRYIMAGE = 0x8004,
|
||||||
|
PCARD_NOCARD = 0x8005,
|
||||||
|
FILTER_CONTINUE = 0x8010,
|
||||||
|
}
|
||||||
@@ -3994,11 +3994,6 @@ namespace NTwain.Data
|
|||||||
|
|
||||||
// used with DAT_TWAINDIRECT
|
// used with DAT_TWAINDIRECT
|
||||||
SETTASK = 0x0B01,
|
SETTASK = 0x0B01,
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// KODAK only. Used with DAT_EXTIMAGEINFO in state 6.
|
|
||||||
/// </summary>
|
|
||||||
GETSPECIAL = 0x8005
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
@@ -4311,79 +4306,6 @@ namespace NTwain.Data
|
|||||||
IALEVEL = 0x1251,
|
IALEVEL = 0x1251,
|
||||||
PRINTER = 0x1252,
|
PRINTER = 0x1252,
|
||||||
BARCODETEXT2 = 0x1253,
|
BARCODETEXT2 = 0x1253,
|
||||||
|
|
||||||
// KODAK USE
|
|
||||||
HDR_PAGESIDE = 0x8001, // 0-front 1-rear
|
|
||||||
HDR_DOCUMENTCOUNT = 0x8002, // Count of pages (seeded by user)
|
|
||||||
HDR_LENGTH = 0x8003, // Number of bytes of image data
|
|
||||||
HDR_LEVEL = 0x8004, // Image Address Level
|
|
||||||
HDR_MODE = 0x8005, // Gemini Mode (1-18)
|
|
||||||
HDR_LINELENGTH = 0x8006, // Width
|
|
||||||
HDR_PAGELENGTH = 0x8007, // Height
|
|
||||||
HDR_COMPRESSION = 0x8008, // ICAP_COMPRESSION TWCP_* value
|
|
||||||
HDR_DATE = 0x8009, // YY/MM/DD
|
|
||||||
HDR_TIME = 0x800A, // HH/MM/00
|
|
||||||
HDR_ROLL = 0x800B, // Imagelink 990 Film Roll Number
|
|
||||||
HDR_RESOLUTION = 0x800C, // Dots Per Inch (DPI)
|
|
||||||
HDR_BITORDER = 0x800D, // Bit order in a byte
|
|
||||||
HDR_SKEW = 0x800E, // (obsolete)
|
|
||||||
HDR_MOMENTARYFLAG = 0x800F, // Gemini Momentary
|
|
||||||
HDR_LATCHEDFLAG = 0x8010, // Gemini Latched
|
|
||||||
HDR_BARCODE = 0x8011, // Gemini Barcode(s)
|
|
||||||
HDR_DESKEW = 0x8012, // Deskew status
|
|
||||||
HDR_DESKEWANGLE = 0x8013, // Deskew angle
|
|
||||||
HDR_POLARITY = 0x8014, // ICAP_PIXELFLAVOR TWPF_* value
|
|
||||||
HDR_PRINTERSTRING = 0x8015, // Viper/Prism/Wildfire printed string
|
|
||||||
HDR_PRINTERINDEX = 0x8016, // Kinda like the document count
|
|
||||||
HDR_IMAGENUMBER = 0x8017, // Count images this session
|
|
||||||
HDR_PAGENUMBER = 0x8018, // Count sheets of paper this session
|
|
||||||
HDR_PAGEIMAGENUMBER = 0x8019, // Image count on a page (1 - 4)
|
|
||||||
HDR_BOOKNAME_A = 0x801A, // Fixed field Gemini/Prism/Wildfire A
|
|
||||||
HDR_BOOKNAME_B = 0x801B, // Fixed field Prism/Wildfire B
|
|
||||||
HDR_BOOKNAME_C = 0x801C, // Fixed field Prism/Wildfire C
|
|
||||||
HDR_BOOKNAME_D = 0x801D, // Fixed field Prism/Wildfire D
|
|
||||||
HDR_IMAGEADDRESSSTRING = 0x801E, // Prism/Wildfire image address string
|
|
||||||
HDR_XOFFSET = 0x801F, // Left cropping offset
|
|
||||||
HDR_YOFFSET = 0x8020, // Right cropping offset
|
|
||||||
HDR_FEATUREPATCH = 0x8021, // Feature patch (only image with patch: i200/i600)
|
|
||||||
HDR_IMAGEADDRESSDEFS = 0x8022, // Image Address field definitions
|
|
||||||
HDR_PCARD_HEADER = 0x8023, // Personality-Card Header
|
|
||||||
HDR_PCARD_FOOTER = 0x8024, // Personality-Card Footer
|
|
||||||
HDR_TOKEN_COUNT = 0x8025, // Alien token flag
|
|
||||||
HDR_REGENERATION = 0x8026, // Alien retry count
|
|
||||||
HDR_IMAGESTATUS = 0x8027, // Alien image status
|
|
||||||
HDR_DITHER = 0x8028, // Bitonal dithering algorithm used
|
|
||||||
HDR_PATCHDETECTED = 0x8029, // Patch was found on the document
|
|
||||||
HDR_FOLDEDCORNERPERCENTAGE = 0x802A, // Phoenix folded corner percentage
|
|
||||||
HDR_DESKEWCONFIDENCEFACTOR = 0x802B, // Phoenix deskew confidence factor
|
|
||||||
HDR_BITONALCONTRASTPERCENTAGE = 0x802C, // Phoenix bitonal contrast percentage
|
|
||||||
HDR_BITONALCONTRAST = 0x802D, // Phoenix bitonal contrast
|
|
||||||
HDR_BITONALTHRESHOLD = 0x802E, // Phoenix bitonal threshold
|
|
||||||
HDR_SUMHISTOGRAM = 0x802F, // Phoenix sum historgram
|
|
||||||
HDR_DIFFERENCEHISTOGRAM = 0x8030, // Phoenix difference histogram
|
|
||||||
HDR_GAMMATABLE = 0x8031, // Phoenix gamma table
|
|
||||||
HDR_MULTIFEED = 0x8032, // Multifeed detected
|
|
||||||
HDR_DESKEWANGLEACTUAL = 0x8033, // Signed deskew angle to scanner precision
|
|
||||||
HDR_RAWIMAGEHEADER = 0x8034, // Raw image header from scanner
|
|
||||||
HDR_LONGPAPERSEGMENT = 0x8035, // Long paper segment number
|
|
||||||
HDR_LONGPAPERLASTSEGMENT = 0x8036, // Long pager last segment
|
|
||||||
HDR_AUTOCOLORDETECTED = 0x8037, // Auto color detected
|
|
||||||
HDR_AUTOCOLORAMOUNT = 0x8038, // Auto color amount
|
|
||||||
HDR_AUTOCOLORTHRESHOLD = 0x8039, // Auto color threshold
|
|
||||||
HDR_XML = 0x803A, // <reportimage> data in XML format (see sample at end of file)
|
|
||||||
HDR_DROPOUTSTATUS = 0x803B, // ECDO Algorithm Status
|
|
||||||
HDR_PROCESSINGSTATUS = 0x803C, // Processing Status
|
|
||||||
HDR_BINARIZATIONQUALITY = 0x803D, // Conveys the quality level of the binarized image
|
|
||||||
HDR_DUALSTACKINGSTACK = 0x803E, // Which output tray a document was dropped into (i5000 only)
|
|
||||||
// Only valid if dual stacking is enabled; legal values are 1 and 2
|
|
||||||
HDR_PAPERDESTINATION = 0x803F, // Which output tray a document
|
|
||||||
// was dropped into (i5000 only)
|
|
||||||
HDR_SLEEVETYPE = 0x8040, // Type of sleeve that was detected during Sleeve Scanning
|
|
||||||
HDR_MULTIIMAGEINDEX = 0x8041, // Image ID for the image that was split from a document
|
|
||||||
HDR_MULTIIMAGETOTAL = 0x8042, // Total number of images split from a document
|
|
||||||
HDR_ENDOFSHEET = 0x8043, // Is this the last image on this sheet? (0-no or 1-yes)
|
|
||||||
HDR_STAMPEDSTRING = 0x8044, // Stamped string
|
|
||||||
HDR_STAMPCOUNT = 0x8045, // Digital Stamping Counter
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public enum TWEJ : ushort
|
public enum TWEJ : ushort
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
using NTwain.Data;
|
using NTwain.Data;
|
||||||
|
using NTwain.Data.KDS;
|
||||||
using NTwain.DSM;
|
using NTwain.DSM;
|
||||||
|
|
||||||
namespace NTwain.Triplets.ImageDATs;
|
namespace NTwain.Triplets.ImageDATs;
|
||||||
@@ -59,11 +60,11 @@ public class ExtImageInfo
|
|||||||
{
|
{
|
||||||
if (TWPlatform.Is32bit && TWPlatform.PreferLegacyDSM)
|
if (TWPlatform.Is32bit && TWPlatform.PreferLegacyDSM)
|
||||||
{
|
{
|
||||||
rc = WinLegacyDSM.DSM_Entry(ref app, ref ds, DG.IMAGE, DAT.EXTIMAGEINFO, MSG.GETSPECIAL, ref data);
|
rc = WinLegacyDSM.DSM_Entry(ref app, ref ds, DG.IMAGE, DAT.EXTIMAGEINFO, (MSG)KDS_MSG.GETSPECIAL, ref data);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
rc = WinNewDSM.DSM_Entry(ref app, ref ds, DG.IMAGE, DAT.EXTIMAGEINFO, MSG.GETSPECIAL, ref data);
|
rc = WinNewDSM.DSM_Entry(ref app, ref ds, DG.IMAGE, DAT.EXTIMAGEINFO, (MSG)KDS_MSG.GETSPECIAL, ref data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (TWPlatform.IsMacOSX)
|
else if (TWPlatform.IsMacOSX)
|
||||||
@@ -72,11 +73,11 @@ public class ExtImageInfo
|
|||||||
TW_IDENTITY_MACOSX ds2 = ds;
|
TW_IDENTITY_MACOSX ds2 = ds;
|
||||||
if (TWPlatform.PreferLegacyDSM)
|
if (TWPlatform.PreferLegacyDSM)
|
||||||
{
|
{
|
||||||
rc = OSXLegacyDSM.DSM_Entry(ref app2, ref ds2, DG.IMAGE, DAT.EXTIMAGEINFO, MSG.GETSPECIAL, ref data);
|
rc = OSXLegacyDSM.DSM_Entry(ref app2, ref ds2, DG.IMAGE, DAT.EXTIMAGEINFO, (MSG)KDS_MSG.GETSPECIAL, ref data);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
rc = OSXNewDSM.DSM_Entry(ref app2, ref ds2, DG.IMAGE, DAT.EXTIMAGEINFO, MSG.GETSPECIAL, ref data);
|
rc = OSXNewDSM.DSM_Entry(ref app2, ref ds2, DG.IMAGE, DAT.EXTIMAGEINFO, (MSG)KDS_MSG.GETSPECIAL, ref data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return rc;
|
return rc;
|
||||||
|
|||||||
Reference in New Issue
Block a user