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 {