From 2ae7293c44931595c699e913b45c3d501a5c4bce Mon Sep 17 00:00:00 2001
From: Eugene Wang <8755753+soukoku@users.noreply.github.com>
Date: Thu, 20 Nov 2025 20:46:15 -0500
Subject: [PATCH] Fix build errors and warnings.
---
samples/ScannerTester/MainForm.cs | 14 +-
samples/ScannerTester/ScannerTester.csproj | 25 +-
samples/ScannerTester/app.manifest | 80 ---
samples/WinForm32/Form1.cs | 666 +++++++++++----------
samples/WinForm32/WinForm32.csproj | 20 +-
samples/WinForm64/WinForm64.csproj | 62 +-
src/NTwain/TwainAppSession.Caps.cs | 2 +-
7 files changed, 398 insertions(+), 471 deletions(-)
delete mode 100644 samples/ScannerTester/app.manifest
diff --git a/samples/ScannerTester/MainForm.cs b/samples/ScannerTester/MainForm.cs
index 85db07e..16cae77 100644
--- a/samples/ScannerTester/MainForm.cs
+++ b/samples/ScannerTester/MainForm.cs
@@ -36,11 +36,11 @@ namespace ScannerTester
//_ = _twain.OpenDSMAsync();
}
- protected override void OnClosed(EventArgs e)
+ protected override void OnFormClosed(FormClosedEventArgs e)
{
_twain.CloseDSM();
//_ = _twain.CloseDSMAsync();
- base.OnClosed(e);
+ base.OnFormClosed(e);
}
private void _twain_Transferred(TwainAppSession sender, TransferredEventArgs e)
@@ -196,14 +196,14 @@ namespace ScannerTester
});
}
- protected override void OnClosing(CancelEventArgs e)
+ protected override void OnFormClosing(FormClosingEventArgs e)
{
if (_twain.State > STATE.S5)
{
e.Cancel = true;
}
_twain.TryStepdown(STATE.S2);
- base.OnClosing(e);
+ base.OnFormClosing(e);
}
private void btnSelectScanner_Click(object sender, EventArgs e)
@@ -247,7 +247,7 @@ namespace ScannerTester
private void LoadSettings()
{
- var mechs = _twain.Caps.ICAP_XFERMECH.Get();
+ var mechs = _twain.Caps.ICAP_XFERMECH.Get().GetValues();
if (!mechs.Contains(TWSX.FILE))
{
@@ -263,7 +263,7 @@ namespace ScannerTester
LogIt("Set unit to inches", sts);
}
- var dpis = _twain.Caps.ICAP_XRESOLUTION.Get();
+ var dpis = _twain.Caps.ICAP_XRESOLUTION.Get().GetValues();
listDpi.Items.Clear();
if (dpis.Contains(200))
{
@@ -284,7 +284,7 @@ namespace ScannerTester
LogIt("300 DPI doesn't appear to be supported.");
}
- var formats = _twain.Caps.ICAP_IMAGEFILEFORMAT.Get();
+ var formats = _twain.Caps.ICAP_IMAGEFILEFORMAT.Get().GetValues();
listFormat.Items.Clear();
foreach (var format in formats)
{
diff --git a/samples/ScannerTester/ScannerTester.csproj b/samples/ScannerTester/ScannerTester.csproj
index 41d3ac3..66b5c42 100644
--- a/samples/ScannerTester/ScannerTester.csproj
+++ b/samples/ScannerTester/ScannerTester.csproj
@@ -1,17 +1,18 @@
-
- WinExe
- net10.0-windows7.0
- enable
- true
- enable
- app.manifest
- x86
-
+
+ WinExe
+ net10.0-windows7.0
+ enable
+ true
+ enable
+ x86
+ PerMonitorV2
+ true
+
-
-
-
+
+
+
\ No newline at end of file
diff --git a/samples/ScannerTester/app.manifest b/samples/ScannerTester/app.manifest
deleted file mode 100644
index a469946..0000000
--- a/samples/ScannerTester/app.manifest
+++ /dev/null
@@ -1,80 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- true/pm
- PerMonitorV2,PerMonitor
- true
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/samples/WinForm32/Form1.cs b/samples/WinForm32/Form1.cs
index d2b90d1..cc9de27 100644
--- a/samples/WinForm32/Form1.cs
+++ b/samples/WinForm32/Form1.cs
@@ -1,5 +1,6 @@
using Microsoft.Win32;
using NTwain;
+using NTwain.Caps;
using NTwain.Data;
using System;
using System.Collections.Generic;
@@ -14,10 +15,10 @@ using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
-namespace WinFormSample
+namespace WinFormSample;
+
+public partial class Form1 : Form
{
- public partial class Form1 : Form
- {
bool useDiyPump = true;
TwainAppSession twain;
readonly string saveFolder;
@@ -31,275 +32,277 @@ namespace WinFormSample
public Form1()
{
- InitializeComponent();
- var libVer = FileVersionInfo.GetVersionInfo(typeof(TwainAppSession).Assembly.Location).ProductVersion;
- Text += $"{(TWPlatform.Is32bit ? " 32bit" : " 64bit")} on NTwain {libVer}";
+ InitializeComponent();
+ var libVer = FileVersionInfo.GetVersionInfo(typeof(TwainAppSession).Assembly.Location).ProductVersion;
+ Text += $"{(TWPlatform.Is32bit ? " 32bit" : " 64bit")} on NTwain {libVer}";
- TWPlatform.PreferLegacyDSM = false;
+ TWPlatform.PreferLegacyDSM = false;
- twain = new TwainAppSession();
- twain.StateChanged += Twain_StateChanged;
- twain.DefaultSourceChanged += Twain_DefaultSourceChanged;
- twain.CurrentSourceChanged += Twain_CurrentSourceChanged;
- twain.SourceDisabled += Twain_SourceDisabled;
- twain.TransferReady += Twain_TransferReady;
- twain.Transferred += Twain_Transferred;
- twain.TransferError += Twain_TransferError;
- twain.DeviceEvent += Twain_DeviceEvent;
+ twain = new TwainAppSession();
+ twain.StateChanged += Twain_StateChanged;
+ twain.DefaultSourceChanged += Twain_DefaultSourceChanged;
+ twain.CurrentSourceChanged += Twain_CurrentSourceChanged;
+ twain.SourceDisabled += Twain_SourceDisabled;
+ twain.TransferReady += Twain_TransferReady;
+ twain.Transferred += Twain_Transferred;
+ twain.TransferError += Twain_TransferError;
+ twain.DeviceEvent += Twain_DeviceEvent;
- capListView.SetDoubleBufferedAsNeeded();
- SystemEvents.SessionSwitch += SystemEvents_SessionSwitch;
+ capListView.SetDoubleBufferedAsNeeded();
+ SystemEvents.SessionSwitch += SystemEvents_SessionSwitch;
- saveFolder = Path.Combine(Path.GetTempPath(), "ntwain-sample" + Path.DirectorySeparatorChar);
- Directory.CreateDirectory(saveFolder);
+ saveFolder = Path.Combine(Path.GetTempPath(), "ntwain-sample" + Path.DirectorySeparatorChar);
+ Directory.CreateDirectory(saveFolder);
- this.Disposed += Form1_Disposed;
+ this.Disposed += Form1_Disposed;
- _jpegParameters = new EncoderParameters(1);
- _jpegParameters.Param[0] = new EncoderParameter(Encoder.Quality, (long)_jpegQuality);
- _jpegEncoder = ImageCodecInfo.GetImageEncoders().First(enc => enc.FormatID == ImageFormat.Jpeg.Guid);
+ _jpegParameters = new EncoderParameters(1);
+ _jpegParameters.Param[0] = new EncoderParameter(Encoder.Quality, (long)_jpegQuality);
+ _jpegEncoder = ImageCodecInfo.GetImageEncoders().First(enc => enc.FormatID == ImageFormat.Jpeg.Guid);
}
private void Twain_SourceDisabled(TwainAppSession sender, TW_IDENTITY_LEGACY e)
{
- BeginInvoke(() =>
- {
- if (watch.IsRunning)
+ BeginInvoke(() =>
{
- watch.Stop();
- MessageBox.Show($"Took {watch.Elapsed} to finish that transfer.");
- }
- });
+ if (watch.IsRunning)
+ {
+ watch.Stop();
+ MessageBox.Show($"Took {watch.Elapsed} to finish that transfer.");
+ }
+ });
}
private void SystemEvents_SessionSwitch(object sender, SessionSwitchEventArgs e)
{
- switch (e.Reason)
- {
- case SessionSwitchReason.RemoteConnect:
- case SessionSwitchReason.SessionUnlock:
- case SessionSwitchReason.SessionLogon:
- capListView.SetDoubleBufferedAsNeeded();
- break;
- }
+ switch (e.Reason)
+ {
+ case SessionSwitchReason.RemoteConnect:
+ case SessionSwitchReason.SessionUnlock:
+ case SessionSwitchReason.SessionLogon:
+ capListView.SetDoubleBufferedAsNeeded();
+ break;
+ }
}
protected override async void OnHandleCreated(EventArgs e)
{
- base.OnHandleCreated(e);
+ base.OnHandleCreated(e);
- if (useDiyPump)
- {
- var sts = await twain.OpenDSMAsync();
- Debug.WriteLine($"OpenDSMAsync={sts}");
- }
- else
- {
- var hwnd = this.Handle;
- var sts = twain.OpenDSM(hwnd, SynchronizationContext.Current!);
- twain.AddWinformFilter();
- Debug.WriteLine($"OpenDSM={sts}");
- }
+ if (useDiyPump)
+ {
+ var sts = await twain.OpenDSMAsync();
+ Debug.WriteLine($"OpenDSMAsync={sts}");
+ }
+ else
+ {
+ var hwnd = this.Handle;
+ var sts = twain.OpenDSM(hwnd, SynchronizationContext.Current!);
+ twain.AddWinformFilter();
+ Debug.WriteLine($"OpenDSM={sts}");
+ }
}
- protected override void OnClosing(CancelEventArgs e)
+ protected override void OnFormClosing(FormClosingEventArgs e)
{
- var finalState = twain.TryStepdown(STATE.S2);
- Debug.WriteLine($"Stepdown result state={finalState}");
- twain.RemoveWinformFilter();
- base.OnClosing(e);
+ var finalState = twain.TryStepdown(STATE.S2);
+ Debug.WriteLine($"Stepdown result state={finalState}");
+ twain.RemoveWinformFilter();
+ base.OnFormClosing(e);
}
private void Form1_Disposed(object? sender, EventArgs e)
{
- twain.Dispose();
+ twain.Dispose();
}
private void Twain_DeviceEvent(TwainAppSession sender, TW_DEVICEEVENT e)
{
- Debug.WriteLine($"[thread {Environment.CurrentManagedThreadId}] device event {e}.");
+ Debug.WriteLine($"[thread {Environment.CurrentManagedThreadId}] device event {e}.");
}
private void Twain_TransferError(TwainAppSession sender, TransferErrorEventArgs e)
{
- if (e.Exception != null)
- {
- Debug.WriteLine($"[thread {Environment.CurrentManagedThreadId}] transfer error {e.Exception}.");
- }
- else
- {
- Debug.WriteLine($"[thread {Environment.CurrentManagedThreadId}] transfer error {e.Code}.");
- }
+ if (e.Exception != null)
+ {
+ Debug.WriteLine($"[thread {Environment.CurrentManagedThreadId}] transfer error {e.Exception}.");
+ }
+ else
+ {
+ Debug.WriteLine($"[thread {Environment.CurrentManagedThreadId}] transfer error {e.Code}.");
+ }
}
private void Twain_Transferred(TwainAppSession sender, TransferredEventArgs e)
{
- Debug.WriteLine($"[thread {Environment.CurrentManagedThreadId}] data transferred with info {e.ImageInfo}");
- // if using a high-speed scanner, imaging handling could be a bottleneck
- // so it's possible to pass the data to another thread while the scanning
- // loop happens. Just remember to dispose it after.
+ Debug.WriteLine($"[thread {Environment.CurrentManagedThreadId}] data transferred with info {e.ImageInfo}");
+ // if using a high-speed scanner, imaging handling could be a bottleneck
+ // so it's possible to pass the data to another thread while the scanning
+ // loop happens. Just remember to dispose it after.
- if (_useThreadForImag)
- {
- // bad thread example but whatev. should use a dedicated thread of some sort for real
- Task.Run(() =>
+ if (_useThreadForImag)
{
- HandleTransferredData(e);
- });
- }
- else
- {
- HandleTransferredData(e);
- }
+ // bad thread example but whatev. should use a dedicated thread of some sort for real
+ Task.Run(() =>
+ {
+ HandleTransferredData(e);
+ });
+ }
+ else
+ {
+ HandleTransferredData(e);
+ }
}
private void HandleTransferredData(TransferredEventArgs e)
{
- if (e.Data != null)
- {
- try
+ if (e.Data != null)
{
- // example of using some lib to handle image data
- var saveFile = Path.Combine(saveFolder, (DateTime.Now.Ticks / 1000).ToString());
+ try
+ {
+ // example of using some lib to handle image data
+ var saveFile = Path.Combine(saveFolder, (DateTime.Now.Ticks / 1000).ToString());
- if (_useSystemDrawing)
- {
- using (var img = Image.FromStream(e.Data.AsStream()))
- {
- if (img.PixelFormat == System.Drawing.Imaging.PixelFormat.Format1bppIndexed ||
- img.PixelFormat == System.Drawing.Imaging.PixelFormat.Format8bppIndexed)
- {
- // bw or gray
- saveFile += ".png";
- if (_saveDisk) img.Save(saveFile, ImageFormat.Png);
- else img.Save(new NoOpStream(), ImageFormat.Png);
- }
- else
- {
- // color
- saveFile += ".jpg";
- if (_saveDisk) img.Save(saveFile, _jpegEncoder, _jpegParameters);
- else img.Save(new NoOpStream(), _jpegEncoder, _jpegParameters);
- }
+ if (_useSystemDrawing)
+ {
+ using (var img = Image.FromStream(e.Data.AsStream()))
+ {
+ if (img.PixelFormat == System.Drawing.Imaging.PixelFormat.Format1bppIndexed ||
+ img.PixelFormat == System.Drawing.Imaging.PixelFormat.Format8bppIndexed)
+ {
+ // bw or gray
+ saveFile += ".png";
+ if (_saveDisk) img.Save(saveFile, ImageFormat.Png);
+ else img.Save(new NoOpStream(), ImageFormat.Png);
+ }
+ else
+ {
+ // color
+ saveFile += ".jpg";
+ if (_saveDisk) img.Save(saveFile, _jpegEncoder, _jpegParameters);
+ else img.Save(new NoOpStream(), _jpegEncoder, _jpegParameters);
+ }
+ }
+ }
+ else
+ {
+ using (var img = new ImageMagick.MagickImage(e.Data.AsSpan()))
+ {
+ var format = ImageMagick.MagickFormat.Png;
+ if (img.ColorType == ImageMagick.ColorType.Palette)
+ {
+ // bw or gray
+ saveFile += ".png";
+ }
+ else
+ {
+ // color
+ saveFile += ".jpg";
+ format = ImageMagick.MagickFormat.Jpeg;
+ img.Quality = (uint)_jpegQuality;
+ }
+ if (_saveDisk) img.Write(saveFile);
+ else img.Write(new NoOpStream(), format);
+ }
+ Debug.WriteLine($"Saved image to {saveFile}");
+ }
}
- }
- else
- {
- using (var img = new ImageMagick.MagickImage(e.Data.AsSpan()))
+ catch { }
+ finally
{
- var format = ImageMagick.MagickFormat.Png;
- if (img.ColorType == ImageMagick.ColorType.Palette)
- {
- // bw or gray
- saveFile += ".png";
- }
- else
- {
- // color
- saveFile += ".jpg";
- format = ImageMagick.MagickFormat.Jpeg;
- img.Quality = (uint)_jpegQuality;
- }
- if (_saveDisk) img.Write(saveFile);
- else img.Write(new NoOpStream(), format);
+ e.Dispose();
}
- Debug.WriteLine($"Saved image to {saveFile}");
- }
}
- catch { }
- finally
- {
- e.Dispose();
- }
- }
}
private void Twain_TransferReady(TwainAppSession sender, TransferReadyEventArgs e)
{
- Debug.WriteLine($"[thread {Environment.CurrentManagedThreadId}] transfer ready.");
+ Debug.WriteLine($"[thread {Environment.CurrentManagedThreadId}] transfer ready.");
}
private void Twain_DefaultSourceChanged(TwainAppSession sender, TW_IDENTITY_LEGACY ds)
{
- BeginInvoke(() => lblDefault.Text = ds.ProductName);
+ BeginInvoke(() => lblDefault.Text = ds.ProductName);
}
private void Twain_StateChanged(TwainAppSession sender, STATE state)
{
- BeginInvoke(() => lblState.Text = state.ToString());
+ BeginInvoke(() => lblState.Text = state.ToString());
}
private void Twain_CurrentSourceChanged(TwainAppSession sender, TW_IDENTITY_LEGACY ds)
{
- BeginInvoke(() =>
- {
- lblCurrent.Text = ds.ToString();
- if (twain.State == STATE.S4)
+ BeginInvoke(() =>
{
- LoadCapInfoList();
+ lblCurrent.Text = ds.ToString();
+ if (twain.State == STATE.S4)
+ {
+ LoadCapInfoList();
- // never seen a driver support these but here it is to test it
- if (twain.GetCapLabel(CAP.ICAP_SUPPORTEDSIZES, out string? test).RC == TWRC.SUCCESS)
- {
- Debug.WriteLine($"Supported sizes label from ds = {test}");
- }
- if (twain.GetCapHelp(CAP.ICAP_SUPPORTEDSIZES, out string? test2).RC == TWRC.SUCCESS)
- {
- Debug.WriteLine($"Supported sizes help from ds = {test2}");
- }
- if (twain.GetCapLabelEnum(CAP.ICAP_SUPPORTEDSIZES, out IList? test3).RC == TWRC.SUCCESS && test3 != null)
- {
- Debug.WriteLine($"Supported sizes label enum from ds = {string.Join(Environment.NewLine, test3)}");
- }
- }
- else
- {
- capListView.Items.Clear();
- }
- });
+ // never seen a driver support these but here it is to test it
+ if (twain.GetCapLabel(CAP.ICAP_SUPPORTEDSIZES, out string? test).RC == TWRC.SUCCESS)
+ {
+ Debug.WriteLine($"Supported sizes label from ds = {test}");
+ }
+ if (twain.GetCapHelp(CAP.ICAP_SUPPORTEDSIZES, out string? test2).RC == TWRC.SUCCESS)
+ {
+ Debug.WriteLine($"Supported sizes help from ds = {test2}");
+ }
+ if (twain.GetCapLabelEnum(CAP.ICAP_SUPPORTEDSIZES, out IList? test3).RC == TWRC.SUCCESS && test3 != null)
+ {
+ Debug.WriteLine($"Supported sizes label enum from ds = {string.Join(Environment.NewLine, test3)}");
+ }
+ }
+ else
+ {
+ capListView.Items.Clear();
+ }
+ });
}
private void LoadCapInfoList()
{
- twain.GetCapValues(CAP.CAP_SUPPORTEDCAPS, out IList caps);
- twain.GetCapValues(CAP.CAP_EXTENDEDCAPS, out IList extended);
- foreach (var c in caps)
- {
- ListViewItem it = new(GetFriendlyName(c));
+ twain.GetCapValues(CAP.CAP_SUPPORTEDCAPS, out ValueContainer capsContainer);
+ twain.GetCapValues(CAP.CAP_EXTENDEDCAPS, out ValueContainer extendedContainer);
+ var caps = capsContainer.GetValues().ToList();
+ var extended = extendedContainer.GetValues().ToList();
+ foreach (var c in caps)
+ {
+ ListViewItem it = new(GetFriendlyName(c));
- if (twain.GetCapCurrent(c, out TW_CAPABILITY twcap).RC == TWRC.SUCCESS)
- {
- var enumType = SizeAndConversionUtils.GetEnumType(c);
- var realType = twcap.DetermineValueType(twain);
- it.SubItems.Add(enumType?.Name.ToString() ?? realType.ToString());
- it.SubItems.Add(ReadTypedValue(c, enumType, realType, forCurrent: true));
- it.SubItems.Add(ReadTypedValue(c, enumType, realType, forCurrent: false));
+ if (twain.GetCapCurrent(c, out TW_CAPABILITY twcap).RC == TWRC.SUCCESS)
+ {
+ var enumType = SizeAndConversionUtils.GetEnumType(c);
+ var realType = twcap.DetermineValueType(twain);
+ it.SubItems.Add(enumType?.Name.ToString() ?? realType.ToString());
+ it.SubItems.Add(ReadTypedValue(c, enumType, realType, forCurrent: true));
+ it.SubItems.Add(ReadTypedValue(c, enumType, realType, forCurrent: false));
+ }
+ else
+ {
+ it.SubItems.Add("");
+ it.SubItems.Add("");
+ it.SubItems.Add("");
+ }
+ it.SubItems.Add(extended.Contains(c).ToString());
+ var supports = twain.QueryCapSupport(c);
+ it.SubItems.Add(supports.ToString());
+ if (!supports.HasFlag(TWQC.SET)) it.ForeColor = Color.Gray;
+ capListView.Items.Add(it);
}
- else
- {
- it.SubItems.Add("");
- it.SubItems.Add("");
- it.SubItems.Add("");
- }
- it.SubItems.Add(extended.Contains(c).ToString());
- var supports = twain.QueryCapSupport(c);
- it.SubItems.Add(supports.ToString());
- if (!supports.HasFlag(TWQC.SET)) it.ForeColor = Color.Gray;
- capListView.Items.Add(it);
- }
}
private string GetFriendlyName(CAP c)
{
- if (c > CAP.CAP_CUSTOMBASE)
- {
- return $"{CAP.CAP_CUSTOMBASE} + {c - CAP.CAP_CUSTOMBASE}";
- }
- return c.ToString();
+ if (c > CAP.CAP_CUSTOMBASE)
+ {
+ return $"{CAP.CAP_CUSTOMBASE} + {c - CAP.CAP_CUSTOMBASE}";
+ }
+ return c.ToString();
}
// there may be a better way...
@@ -307,189 +310,188 @@ namespace WinFormSample
private string ReadTypedValue(CAP cap, Type? enumType, TWTY type, bool forCurrent)
{
- if (enumType != null)
- {
- if (forCurrent)
+ if (enumType != null)
{
- var currentMethod = twainMethods
- .FirstOrDefault(m => m.Name == nameof(TwainAppSession.GetCapCurrent) && m.IsGenericMethod)!
- .MakeGenericMethod(enumType);
- var args = new object?[] { cap, null };
- currentMethod.Invoke(twain, args);
- var values = (System.Collections.IList)args[1]!;
- if (values.Count == 1)
- {
- return values[0]!.ToString()!;
- }
- else if (values.Count > 1)
- {
- return string.Join(", ", values);
- }
- return "";
+ if (forCurrent)
+ {
+ var currentMethod = twainMethods
+ .FirstOrDefault(m => m.Name == nameof(TwainAppSession.GetCapCurrent) && m.IsGenericMethod)!
+ .MakeGenericMethod(enumType);
+ var args = new object?[] { cap, null };
+ currentMethod.Invoke(twain, args);
+ var values = (System.Collections.IList)args[1]!;
+ if (values.Count == 1)
+ {
+ return values[0]!.ToString()!;
+ }
+ else if (values.Count > 1)
+ {
+ return string.Join(", ", values);
+ }
+ return "";
+ }
+ else
+ {
+ var defaultMethod = twainMethods
+ .FirstOrDefault(m => m.Name == nameof(TwainAppSession.GetCapDefault) && m.IsGenericMethod)!
+ .MakeGenericMethod(enumType);
+ var args = new object?[] { cap, null };
+ defaultMethod.Invoke(twain, args);
+ var values = (System.Collections.IList)args[1]!;
+ if (values.Count == 1)
+ {
+ return values[0]!.ToString()!;
+ }
+ else if (values.Count > 1)
+ {
+ return string.Join(", ", values);
+ }
+ return "";
+ }
}
- else
- {
- var defaultMethod = twainMethods
- .FirstOrDefault(m => m.Name == nameof(TwainAppSession.GetCapDefault) && m.IsGenericMethod)!
- .MakeGenericMethod(enumType);
- var args = new object?[] { cap, null };
- defaultMethod.Invoke(twain, args);
- var values = (System.Collections.IList)args[1]!;
- if (values.Count == 1)
- {
- return values[0]!.ToString()!;
- }
- else if (values.Count > 1)
- {
- return string.Join(", ", values);
- }
- return "";
- }
- }
- STS sts = default;
- switch (type)
- {
- case TWTY.UINT8:
- sts = forCurrent ?
- twain.GetCapCurrent(cap, out List ubval) :
- twain.GetCapDefault(cap, out ubval);
- return ubval.FirstOrDefault().ToString();
- case TWTY.INT8:
- sts = forCurrent ?
- twain.GetCapCurrent(cap, out List sbval) :
- twain.GetCapDefault(cap, out sbval);
- return sbval.FirstOrDefault().ToString();
- case TWTY.UINT16:
- sts = forCurrent ?
- twain.GetCapCurrent(cap, out List usval) :
- twain.GetCapDefault(cap, out usval);
- return usval.FirstOrDefault().ToString();
- case TWTY.INT16:
- sts = forCurrent ?
- twain.GetCapCurrent(cap, out List ssval) :
- twain.GetCapDefault(cap, out ssval);
- return ssval.FirstOrDefault().ToString();
- case TWTY.UINT32:
- sts = forCurrent ?
- twain.GetCapCurrent(cap, out List uival) :
- twain.GetCapDefault(cap, out uival);
- return uival.FirstOrDefault().ToString();
- case TWTY.INT32:
- sts = forCurrent ?
- twain.GetCapCurrent(cap, out List sival) :
- twain.GetCapDefault(cap, out sival);
- return sival.FirstOrDefault().ToString();
- case TWTY.BOOL:
- sts = forCurrent ?
- twain.GetCapCurrent(cap, out List tbval) :
- twain.GetCapDefault(cap, out tbval);
- return tbval.FirstOrDefault().ToString();
- case TWTY.FIX32:
- sts = forCurrent ?
- twain.GetCapCurrent(cap, out List fxval) :
- twain.GetCapDefault(cap, out fxval);
- return fxval.FirstOrDefault().ToString();
- case TWTY.FRAME:
- sts = forCurrent ?
- twain.GetCapCurrent(cap, out List frval) :
- twain.GetCapDefault(cap, out frval);
- return frval.FirstOrDefault().ToString();
- case TWTY.STR32:
- sts = forCurrent ?
- twain.GetCapCurrent(cap, out List s32val) :
- twain.GetCapDefault(cap, out s32val);
- return s32val.FirstOrDefault().ToString();
- case TWTY.STR64:
- sts = forCurrent ?
- twain.GetCapCurrent(cap, out List s64val) :
- twain.GetCapDefault(cap, out s64val);
- return s64val.FirstOrDefault().ToString();
- case TWTY.STR128:
- sts = forCurrent ?
- twain.GetCapCurrent(cap, out List s128val) :
- twain.GetCapDefault(cap, out s128val);
- return s128val.FirstOrDefault().ToString();
- case TWTY.STR255:
- sts = forCurrent ?
- twain.GetCapCurrent(cap, out List s255val) :
- twain.GetCapDefault(cap, out s255val);
- return s255val.FirstOrDefault().ToString();
- case TWTY.HANDLE:
- break;
- }
- Debug.WriteLine($"{nameof(ReadTypedValue)}({cap}, {type}, {forCurrent}) => {sts}");
- return "";
+ STS sts = default;
+ switch (type)
+ {
+ case TWTY.UINT8:
+ sts = forCurrent ?
+ twain.GetCapCurrent(cap, out List ubval) :
+ twain.GetCapDefault(cap, out ubval);
+ return ubval.FirstOrDefault().ToString();
+ case TWTY.INT8:
+ sts = forCurrent ?
+ twain.GetCapCurrent(cap, out List sbval) :
+ twain.GetCapDefault(cap, out sbval);
+ return sbval.FirstOrDefault().ToString();
+ case TWTY.UINT16:
+ sts = forCurrent ?
+ twain.GetCapCurrent(cap, out List usval) :
+ twain.GetCapDefault(cap, out usval);
+ return usval.FirstOrDefault().ToString();
+ case TWTY.INT16:
+ sts = forCurrent ?
+ twain.GetCapCurrent(cap, out List ssval) :
+ twain.GetCapDefault(cap, out ssval);
+ return ssval.FirstOrDefault().ToString();
+ case TWTY.UINT32:
+ sts = forCurrent ?
+ twain.GetCapCurrent(cap, out List uival) :
+ twain.GetCapDefault(cap, out uival);
+ return uival.FirstOrDefault().ToString();
+ case TWTY.INT32:
+ sts = forCurrent ?
+ twain.GetCapCurrent(cap, out List sival) :
+ twain.GetCapDefault(cap, out sival);
+ return sival.FirstOrDefault().ToString();
+ case TWTY.BOOL:
+ sts = forCurrent ?
+ twain.GetCapCurrent(cap, out List tbval) :
+ twain.GetCapDefault(cap, out tbval);
+ return tbval.FirstOrDefault().ToString();
+ case TWTY.FIX32:
+ sts = forCurrent ?
+ twain.GetCapCurrent(cap, out List fxval) :
+ twain.GetCapDefault(cap, out fxval);
+ return fxval.FirstOrDefault().ToString();
+ case TWTY.FRAME:
+ sts = forCurrent ?
+ twain.GetCapCurrent(cap, out List frval) :
+ twain.GetCapDefault(cap, out frval);
+ return frval.FirstOrDefault().ToString();
+ case TWTY.STR32:
+ sts = forCurrent ?
+ twain.GetCapCurrent(cap, out List s32val) :
+ twain.GetCapDefault(cap, out s32val);
+ return s32val.FirstOrDefault().ToString();
+ case TWTY.STR64:
+ sts = forCurrent ?
+ twain.GetCapCurrent(cap, out List s64val) :
+ twain.GetCapDefault(cap, out s64val);
+ return s64val.FirstOrDefault().ToString();
+ case TWTY.STR128:
+ sts = forCurrent ?
+ twain.GetCapCurrent(cap, out List s128val) :
+ twain.GetCapDefault(cap, out s128val);
+ return s128val.FirstOrDefault().ToString();
+ case TWTY.STR255:
+ sts = forCurrent ?
+ twain.GetCapCurrent(cap, out List s255val) :
+ twain.GetCapDefault(cap, out s255val);
+ return s255val.FirstOrDefault().ToString();
+ case TWTY.HANDLE:
+ break;
+ }
+ Debug.WriteLine($"{nameof(ReadTypedValue)}({cap}, {type}, {forCurrent}) => {sts}");
+ return "";
}
private void btnSelect_Click(object sender, EventArgs e)
{
- twain.ShowUserSelect();
+ twain.ShowUserSelect();
}
private void btnEnumSources_Click(object sender, EventArgs e)
{
- listSources.Items.Clear();
- foreach (var ds in twain.GetSources())
- {
- listSources.Items.Add(ds);
- }
+ listSources.Items.Clear();
+ foreach (var ds in twain.GetSources())
+ {
+ listSources.Items.Add(ds);
+ }
}
private void btnSetDef_Click(object sender, EventArgs e)
{
- if (listSources.SelectedItem is TW_IDENTITY_LEGACY ds)
- {
- twain.SetDefaultSource(ds);
- }
+ if (listSources.SelectedItem is TW_IDENTITY_LEGACY ds)
+ {
+ twain.SetDefaultSource(ds);
+ }
}
private void btnOpen_Click(object sender, EventArgs e)
{
- if (listSources.SelectedItem is TW_IDENTITY_LEGACY ds)
- {
- twain.TryStepdown(STATE.S3);
+ if (listSources.SelectedItem is TW_IDENTITY_LEGACY ds)
+ {
+ twain.TryStepdown(STATE.S3);
- twain.OpenSource(ds);
- }
+ twain.OpenSource(ds);
+ }
}
private void btnClose_Click(object sender, EventArgs e)
{
- twain.CloseSource();
+ twain.CloseSource();
}
private void btnOpenDef_Click(object sender, EventArgs e)
{
- twain.TryStepdown(STATE.S3);
+ twain.TryStepdown(STATE.S3);
- twain.OpenSource(twain.DefaultSource);
+ twain.OpenSource(twain.DefaultSource);
}
private void btnShowSettings_Click(object sender, EventArgs e)
{
- twain.EnableSource(true, true);
+ twain.EnableSource(true, true);
}
private void btnStart_Click(object sender, EventArgs e)
{
- if (twain.EnableSource(ckShowUI.Checked, false).IsSuccess)
- {
- _useThreadForImag = ckBgImageHandling.Checked;
- _useSystemDrawing = ckSystemDrawing.Checked;
- _saveDisk = ckSaveDisk.Checked;
- watch.Restart();
- }
+ if (twain.EnableSource(ckShowUI.Checked, false).IsSuccess)
+ {
+ _useThreadForImag = ckBgImageHandling.Checked;
+ _useSystemDrawing = ckSystemDrawing.Checked;
+ _saveDisk = ckSaveDisk.Checked;
+ watch.Restart();
+ }
}
private void btnOpenFolder_Click(object sender, EventArgs e)
{
- try
- {
- if (!Directory.Exists(saveFolder)) Directory.CreateDirectory(saveFolder);
- using (Process.Start(new ProcessStartInfo { FileName = saveFolder, UseShellExecute = true })) { }
- }
- catch { }
+ try
+ {
+ if (!Directory.Exists(saveFolder)) Directory.CreateDirectory(saveFolder);
+ using (Process.Start(new ProcessStartInfo { FileName = saveFolder, UseShellExecute = true })) { }
+ }
+ catch { }
}
- }
}
\ No newline at end of file
diff --git a/samples/WinForm32/WinForm32.csproj b/samples/WinForm32/WinForm32.csproj
index 990196f..74a864f 100644
--- a/samples/WinForm32/WinForm32.csproj
+++ b/samples/WinForm32/WinForm32.csproj
@@ -6,24 +6,26 @@
enable
true
x86
- WinFormSample
+ WinFormSample
+ PerMonitorV2
+ true
-
+
-
+
-
- PreserveNewest
-
-
- PreserveNewest
-
+
+ PreserveNewest
+
+
+ PreserveNewest
+
\ No newline at end of file
diff --git a/samples/WinForm64/WinForm64.csproj b/samples/WinForm64/WinForm64.csproj
index a473097..b6e0d0d 100644
--- a/samples/WinForm64/WinForm64.csproj
+++ b/samples/WinForm64/WinForm64.csproj
@@ -1,37 +1,39 @@
-
- WinExe
- net10.0-windows7.0
- enable
- true
- x64
- WinFormSample
-
+
+ WinExe
+ net10.0-windows7.0
+ enable
+ true
+ x64
+ WinFormSample
+ PerMonitorV2
+ true
+
-
-
-
+
+
+
-
-
-
+
+
+
-
-
- %(RecursiveDir)%(Filename)%(Extension)
-
-
- %(RecursiveDir)%(Filename)%(Extension)
-
-
+
+
+ %(RecursiveDir)%(Filename)%(Extension)
+
+
+ %(RecursiveDir)%(Filename)%(Extension)
+
+
-
-
- PreserveNewest
-
-
- PreserveNewest
-
-
+
+
+ PreserveNewest
+
+
+ PreserveNewest
+
+
\ No newline at end of file
diff --git a/src/NTwain/TwainAppSession.Caps.cs b/src/NTwain/TwainAppSession.Caps.cs
index 8f81e1a..84edf02 100644
--- a/src/NTwain/TwainAppSession.Caps.cs
+++ b/src/NTwain/TwainAppSession.Caps.cs
@@ -175,7 +175,7 @@ namespace NTwain
///
///
///
- ///
+ ///
///
public STS GetCapValues(CAP cap, out ValueContainer value) where TValue : struct
{