fix 1
This commit is contained in:
parent
bf873ce0c8
commit
434814a085
13
OTP/Form1.Designer.cs
generated
13
OTP/Form1.Designer.cs
generated
@ -38,6 +38,7 @@
|
|||||||
button4 = new System.Windows.Forms.Button();
|
button4 = new System.Windows.Forms.Button();
|
||||||
button5 = new System.Windows.Forms.Button();
|
button5 = new System.Windows.Forms.Button();
|
||||||
progressBar1 = new System.Windows.Forms.ProgressBar();
|
progressBar1 = new System.Windows.Forms.ProgressBar();
|
||||||
|
label3 = new System.Windows.Forms.Label();
|
||||||
SuspendLayout();
|
SuspendLayout();
|
||||||
//
|
//
|
||||||
// listBox1
|
// listBox1
|
||||||
@ -139,15 +140,26 @@
|
|||||||
// progressBar1
|
// progressBar1
|
||||||
//
|
//
|
||||||
progressBar1.Location = new System.Drawing.Point(640, 165);
|
progressBar1.Location = new System.Drawing.Point(640, 165);
|
||||||
|
progressBar1.Maximum = 30;
|
||||||
progressBar1.Name = "progressBar1";
|
progressBar1.Name = "progressBar1";
|
||||||
progressBar1.Size = new System.Drawing.Size(230, 51);
|
progressBar1.Size = new System.Drawing.Size(230, 51);
|
||||||
progressBar1.TabIndex = 10;
|
progressBar1.TabIndex = 10;
|
||||||
//
|
//
|
||||||
|
// label3
|
||||||
|
//
|
||||||
|
label3.AutoSize = true;
|
||||||
|
label3.Font = new System.Drawing.Font("Segoe UI", 24F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point);
|
||||||
|
label3.Location = new System.Drawing.Point(702, 219);
|
||||||
|
label3.Name = "label3";
|
||||||
|
label3.Size = new System.Drawing.Size(0, 45);
|
||||||
|
label3.TabIndex = 11;
|
||||||
|
//
|
||||||
// Form1
|
// Form1
|
||||||
//
|
//
|
||||||
AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F);
|
AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F);
|
||||||
AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
|
||||||
ClientSize = new System.Drawing.Size(904, 508);
|
ClientSize = new System.Drawing.Size(904, 508);
|
||||||
|
Controls.Add(label3);
|
||||||
Controls.Add(progressBar1);
|
Controls.Add(progressBar1);
|
||||||
Controls.Add(button5);
|
Controls.Add(button5);
|
||||||
Controls.Add(button4);
|
Controls.Add(button4);
|
||||||
@ -180,6 +192,7 @@
|
|||||||
private System.Windows.Forms.Button button4;
|
private System.Windows.Forms.Button button4;
|
||||||
private System.Windows.Forms.Button button5;
|
private System.Windows.Forms.Button button5;
|
||||||
private System.Windows.Forms.ProgressBar progressBar1;
|
private System.Windows.Forms.ProgressBar progressBar1;
|
||||||
|
private System.Windows.Forms.Label label3;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -42,8 +42,8 @@ namespace OTP
|
|||||||
private void Timer_Tick(object sender, EventArgs e)
|
private void Timer_Tick(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
int remainingSeconds = totp.RemainingSeconds();
|
int remainingSeconds = totp.RemainingSeconds();
|
||||||
circularProgressBar1.Text = remainingSeconds.ToString();
|
label3.Text = remainingSeconds.ToString();
|
||||||
circularProgressBar1.Value = remainingSeconds;
|
progressBar1.Value = remainingSeconds;
|
||||||
if (remainingSeconds == 30)
|
if (remainingSeconds == 30)
|
||||||
{
|
{
|
||||||
GenerateAndDisplayTotp();
|
GenerateAndDisplayTotp();
|
||||||
@ -208,8 +208,8 @@ namespace OTP
|
|||||||
label1.Text = "TOTP Code";
|
label1.Text = "TOTP Code";
|
||||||
button1.Enabled = false;
|
button1.Enabled = false;
|
||||||
button2.Enabled = false;
|
button2.Enabled = false;
|
||||||
circularProgressBar1.Text = "time";
|
label3.Text = "time";
|
||||||
circularProgressBar1.Value = 30;
|
progressBar1.Value = 30;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -18,7 +18,7 @@
|
|||||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||||
<resheader name="writer">System.Resources.ResXResourceWriter, 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="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="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||||
</data>
|
</data>
|
||||||
|
13
OTP/Form3.Designer.cs
generated
13
OTP/Form3.Designer.cs
generated
@ -44,6 +44,7 @@
|
|||||||
groupBox1 = new System.Windows.Forms.GroupBox();
|
groupBox1 = new System.Windows.Forms.GroupBox();
|
||||||
button7 = new System.Windows.Forms.Button();
|
button7 = new System.Windows.Forms.Button();
|
||||||
pictureBox1 = new System.Windows.Forms.PictureBox();
|
pictureBox1 = new System.Windows.Forms.PictureBox();
|
||||||
|
button8 = new System.Windows.Forms.Button();
|
||||||
groupBox1.SuspendLayout();
|
groupBox1.SuspendLayout();
|
||||||
((System.ComponentModel.ISupportInitialize)pictureBox1).BeginInit();
|
((System.ComponentModel.ISupportInitialize)pictureBox1).BeginInit();
|
||||||
SuspendLayout();
|
SuspendLayout();
|
||||||
@ -182,6 +183,7 @@
|
|||||||
//
|
//
|
||||||
// groupBox1
|
// groupBox1
|
||||||
//
|
//
|
||||||
|
groupBox1.Controls.Add(button8);
|
||||||
groupBox1.Controls.Add(button7);
|
groupBox1.Controls.Add(button7);
|
||||||
groupBox1.Controls.Add(pictureBox1);
|
groupBox1.Controls.Add(pictureBox1);
|
||||||
groupBox1.Controls.Add(label4);
|
groupBox1.Controls.Add(label4);
|
||||||
@ -221,6 +223,16 @@
|
|||||||
pictureBox1.TabIndex = 14;
|
pictureBox1.TabIndex = 14;
|
||||||
pictureBox1.TabStop = false;
|
pictureBox1.TabStop = false;
|
||||||
//
|
//
|
||||||
|
// button8
|
||||||
|
//
|
||||||
|
button8.Location = new System.Drawing.Point(427, 0);
|
||||||
|
button8.Name = "button8";
|
||||||
|
button8.Size = new System.Drawing.Size(101, 23);
|
||||||
|
button8.TabIndex = 15;
|
||||||
|
button8.Text = "Stop Camera";
|
||||||
|
button8.UseVisualStyleBackColor = true;
|
||||||
|
button8.Click += button8_Click;
|
||||||
|
//
|
||||||
// Form3
|
// Form3
|
||||||
//
|
//
|
||||||
AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F);
|
AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F);
|
||||||
@ -272,5 +284,6 @@
|
|||||||
private System.Windows.Forms.GroupBox groupBox1;
|
private System.Windows.Forms.GroupBox groupBox1;
|
||||||
private System.Windows.Forms.PictureBox pictureBox1;
|
private System.Windows.Forms.PictureBox pictureBox1;
|
||||||
private System.Windows.Forms.Button button7;
|
private System.Windows.Forms.Button button7;
|
||||||
|
private System.Windows.Forms.Button button8;
|
||||||
}
|
}
|
||||||
}
|
}
|
232
OTP/Form3.cs
232
OTP/Form3.cs
@ -1,7 +1,12 @@
|
|||||||
using ScreenCapturerNS;
|
using FlashCap;
|
||||||
|
using FlashCap.Utilities;
|
||||||
|
using ScreenCapturerNS;
|
||||||
using System;
|
using System;
|
||||||
using System.Data.SQLite;
|
using System.Data.SQLite;
|
||||||
using System.Drawing;
|
using System.Drawing;
|
||||||
|
using System.IO;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Threading;
|
||||||
using System.Windows.Forms;
|
using System.Windows.Forms;
|
||||||
using ZXing;
|
using ZXing;
|
||||||
//using AForge.Video;
|
//using AForge.Video;
|
||||||
@ -14,16 +19,20 @@ namespace OTP
|
|||||||
private string connectionString = "Data Source=key.db;Version=3;";
|
private string connectionString = "Data Source=key.db;Version=3;";
|
||||||
private bool isCapturing = false; // 添加标识截图状态的成员变量
|
private bool isCapturing = false; // 添加标识截图状态的成员变量
|
||||||
private bool isLocalfile = false;
|
private bool isLocalfile = false;
|
||||||
private FilterInfoCollection videoDevices; // 声明用于存储摄像头设备信息的变量
|
//private FilterInfoCollection videoDevices; // 声明用于存储摄像头设备信息的变量
|
||||||
private VideoCaptureDevice camera; // 声明用于摄像头捕获的变量
|
//private VideoCaptureDevice camera; // 声明用于摄像头捕获的变量
|
||||||
private bool isCameraRunning = false; // 用于标识摄像头的运行状态
|
private bool isCameraRunning = false; // 用于标识摄像头的运行状态
|
||||||
private bool isScanningPaused = false;
|
private bool isScanningPaused = false;
|
||||||
private Bitmap previousBitmap = null;
|
//private Bitmap previousBitmap = null;
|
||||||
|
private SynchronizationContext synchContext;
|
||||||
|
|
||||||
|
// Constructed capture device.
|
||||||
|
private CaptureDevice captureDevice;
|
||||||
|
|
||||||
public Form3()
|
public Form3()
|
||||||
{
|
{
|
||||||
InitializeComponent();
|
InitializeComponent();
|
||||||
videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);
|
//videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -72,31 +81,6 @@ namespace OTP
|
|||||||
MessageBox.Show($"An error occurred: {ex.Message}");
|
MessageBox.Show($"An error occurred: {ex.Message}");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//这里摆烂,自用的怎么会犯操作上的错误,主要是遇到bug不想修,先晾着
|
|
||||||
//private void deactivateButton(int btn)
|
|
||||||
//{
|
|
||||||
// if (btn == 3)
|
|
||||||
// {
|
|
||||||
// button1.Enabled = false;
|
|
||||||
// button4.Enabled = false;
|
|
||||||
// button5.Enabled = false;
|
|
||||||
// button6.Enabled = false;
|
|
||||||
// }
|
|
||||||
//}
|
|
||||||
//private void activeButton()
|
|
||||||
//{
|
|
||||||
// for (int i = 1; i <= 6; i++)
|
|
||||||
// {
|
|
||||||
// string buttonName = "button" + i;
|
|
||||||
// Control[] controls = this.Controls.Find(buttonName, true);
|
|
||||||
|
|
||||||
// if (controls.Length > 0 && controls[0] is Button)
|
|
||||||
// {
|
|
||||||
// Button button = (Button)controls[0];
|
|
||||||
// button.Enabled = true;
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
//}
|
|
||||||
private void button3_Click(object sender, EventArgs e)
|
private void button3_Click(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
if (isCapturing)
|
if (isCapturing)
|
||||||
@ -134,7 +118,7 @@ namespace OTP
|
|||||||
private void ScanQRCode(Bitmap bitmap)
|
private void ScanQRCode(Bitmap bitmap)
|
||||||
{
|
{
|
||||||
// 创建二维码读取器实例
|
// 创建二维码读取器实例
|
||||||
BarcodeReader barcodeReader = new BarcodeReader();
|
var barcodeReader = new ZXing.Windows.Compatibility.BarcodeReader();
|
||||||
|
|
||||||
// 尝试解码二维码
|
// 尝试解码二维码
|
||||||
Result result = barcodeReader.Decode(bitmap);
|
Result result = barcodeReader.Decode(bitmap);
|
||||||
@ -212,73 +196,146 @@ namespace OTP
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void button5_Click(object sender, EventArgs e)
|
private async void button5_Click(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
isScanningPaused = false;
|
this.synchContext = SynchronizationContext.Current;
|
||||||
button7.Text = "Pause";
|
|
||||||
if (isCameraRunning)
|
////////////////////////////////////////////////
|
||||||
|
// Initialize and start capture device
|
||||||
|
|
||||||
|
// Capture device enumeration:
|
||||||
|
var devices = new CaptureDevices();
|
||||||
|
|
||||||
|
var descriptors = devices.EnumerateDescriptors().
|
||||||
|
// You could filter by device type and characteristics.
|
||||||
|
//Where(d => d.DeviceType == DeviceTypes.DirectShow). // Only DirectShow device.
|
||||||
|
Where(d => d.Characteristics.Length >= 1). // One or more valid video characteristics.
|
||||||
|
ToArray();
|
||||||
|
|
||||||
|
// Use first device.
|
||||||
|
var descriptor0 = descriptors.ElementAtOrDefault(0);
|
||||||
|
|
||||||
|
if (descriptor0 != null)
|
||||||
{
|
{
|
||||||
StopCamera(); // 停止摄像头
|
#if false
|
||||||
|
// Request video characteristics strictly:
|
||||||
|
// Will raise exception when parameters are not accepted.
|
||||||
|
var characteristics = new VideoCharacteristics(
|
||||||
|
PixelFormats.JPEG, 1920, 1080, 60);
|
||||||
|
#else
|
||||||
|
// Or, you could choice from device descriptor:
|
||||||
|
// Hint: Show up video characteristics into ComboBox and like.
|
||||||
|
var characteristics = descriptor0.Characteristics.
|
||||||
|
FirstOrDefault(c => c.PixelFormat != PixelFormats.Unknown);
|
||||||
|
#endif
|
||||||
|
if (characteristics != null)
|
||||||
|
{
|
||||||
|
// Open capture device:
|
||||||
|
this.captureDevice = await descriptor0.OpenAsync(
|
||||||
|
characteristics,
|
||||||
|
this.OnPixelBufferArrived);
|
||||||
|
|
||||||
|
// Start capturing.
|
||||||
|
await this.captureDevice.StartAsync();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
|
||||||
|
}
|
||||||
|
private void OnPixelBufferArrived(PixelBufferScope bufferScope)
|
||||||
|
{
|
||||||
|
////////////////////////////////////////////////
|
||||||
|
// Pixel buffer has arrived.
|
||||||
|
// NOTE: Perhaps this thread context is NOT UI thread.
|
||||||
|
#if false
|
||||||
|
// Get image data binary:
|
||||||
|
byte[] image = bufferScope.Buffer.ExtractImage();
|
||||||
|
#else
|
||||||
|
// Or, refer image data binary directly.
|
||||||
|
// (Advanced manipulation, see README.)
|
||||||
|
ArraySegment<byte> image = bufferScope.Buffer.ReferImage();
|
||||||
|
#endif
|
||||||
|
// Convert to Stream (using FlashCap.Utilities)
|
||||||
|
using (var stream = image.AsStream())
|
||||||
{
|
{
|
||||||
StartCamera(); // 启动摄像头
|
// Decode image data to a bitmap:
|
||||||
|
var bitmap = Image.FromStream(stream);
|
||||||
|
|
||||||
|
// `bitmap` is copied, so we can release pixel buffer now.
|
||||||
|
bufferScope.ReleaseNow();
|
||||||
|
|
||||||
|
// Switch to UI thread.
|
||||||
|
// HACK: Here is using `SynchronizationContext.Post()` instead of `Control.Invoke()`.
|
||||||
|
// Because in sensitive states when the form is closing,
|
||||||
|
// `Control.Invoke()` can fail with exception.
|
||||||
|
this.synchContext.Post(_ =>
|
||||||
|
{
|
||||||
|
// HACK: on .NET Core, will be leaked (or delayed GC?)
|
||||||
|
// So we could release manually before updates.
|
||||||
|
var oldImage = this.BackgroundImage;
|
||||||
|
if (oldImage != null)
|
||||||
|
{
|
||||||
|
//this.BackgroundImage = null;
|
||||||
|
oldImage.Dispose();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update a bitmap.
|
||||||
|
pictureBox1.Image = bitmap;
|
||||||
|
}, null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void StartCamera()
|
private void StartCamera()
|
||||||
{
|
{
|
||||||
if (!isCameraRunning) // 添加条件检查摄像头是否已经在运行
|
//if (!isCameraRunning) // 添加条件检查摄像头是否已经在运行
|
||||||
{
|
//{
|
||||||
if (videoDevices != null && videoDevices.Count > 0)
|
// if (videoDevices != null && videoDevices.Count > 0)
|
||||||
{
|
// {
|
||||||
if (camera == null)
|
// if (camera == null)
|
||||||
{
|
// {
|
||||||
camera = new VideoCaptureDevice(videoDevices[0].MonikerString);
|
// camera = new VideoCaptureDevice(videoDevices[0].MonikerString);
|
||||||
}
|
// }
|
||||||
camera.NewFrame += Camera_NewFrame; // 注册摄像头捕获图像的事件
|
// camera.NewFrame += Camera_NewFrame; // 注册摄像头捕获图像的事件
|
||||||
camera.Start(); // 启动摄像头
|
// camera.Start(); // 启动摄像头
|
||||||
isCameraRunning = true; // 设置摄像头运行状态为 true
|
// isCameraRunning = true; // 设置摄像头运行状态为 true
|
||||||
}
|
// }
|
||||||
else
|
// else
|
||||||
{
|
// {
|
||||||
MessageBox.Show("No camera device found.");
|
// MessageBox.Show("No camera device found.");
|
||||||
}
|
// }
|
||||||
}
|
//}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void StopCamera()
|
private void StopCamera()
|
||||||
{
|
{
|
||||||
if (camera != null && camera.IsRunning)
|
//if (camera != null && camera.IsRunning)
|
||||||
{
|
//{
|
||||||
camera.SignalToStop();
|
// camera.SignalToStop();
|
||||||
camera.WaitForStop();
|
// camera.WaitForStop();
|
||||||
camera.NewFrame -= Camera_NewFrame; // 取消注册摄像头捕获图像的事件
|
// camera.NewFrame -= Camera_NewFrame; // 取消注册摄像头捕获图像的事件
|
||||||
camera = null; // 将摄像头对象置为null,以便下次重新创建
|
// camera = null; // 将摄像头对象置为null,以便下次重新创建
|
||||||
isCameraRunning = false; // 设置摄像头运行状态为 false
|
// isCameraRunning = false; // 设置摄像头运行状态为 false
|
||||||
isScanningPaused = false;
|
// isScanningPaused = false;
|
||||||
button7.Text = "Pause";
|
// button7.Text = "Pause";
|
||||||
}
|
//}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void Camera_NewFrame(object sender, NewFrameEventArgs eventArgs)
|
//private void Camera_NewFrame(object sender, NewFrameEventArgs eventArgs)
|
||||||
{
|
//{
|
||||||
Bitmap bitmap = (Bitmap)eventArgs.Frame.Clone();
|
// //Bitmap bitmap = (Bitmap)eventArgs.Frame.Clone();
|
||||||
if (!isScanningPaused)
|
// //if (!isScanningPaused)
|
||||||
{
|
// //{
|
||||||
if (previousBitmap != null)
|
// // if (previousBitmap != null)
|
||||||
{
|
// // {
|
||||||
previousBitmap.Dispose();
|
// // previousBitmap.Dispose();
|
||||||
}
|
// // }
|
||||||
pictureBox1.Image = bitmap;
|
// // pictureBox1.Image = bitmap;
|
||||||
previousBitmap = bitmap;
|
// // previousBitmap = bitmap;
|
||||||
}
|
// //}
|
||||||
else
|
// //else
|
||||||
{
|
// //{
|
||||||
ScanQRCode(bitmap);
|
// // ScanQRCode(bitmap);
|
||||||
bitmap.Dispose();
|
// // bitmap.Dispose();
|
||||||
}
|
// //}
|
||||||
}
|
//}
|
||||||
|
|
||||||
private void button7_Click(object sender, EventArgs e)
|
private void button7_Click(object sender, EventArgs e)
|
||||||
{
|
{
|
||||||
@ -312,5 +369,12 @@ namespace OTP
|
|||||||
MessageBox.Show("Clipboard content is not a valid OTP link.");
|
MessageBox.Show("Clipboard content is not a valid OTP link.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void button8_Click(object sender, EventArgs e)
|
||||||
|
{
|
||||||
|
// Discard capture device.
|
||||||
|
this.captureDevice?.Dispose();
|
||||||
|
this.captureDevice = null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -18,7 +18,7 @@
|
|||||||
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
|
||||||
<resheader name="writer">System.Resources.ResXResourceWriter, 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="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="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
|
||||||
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
|
||||||
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
<value>[base64 mime encoded serialized .NET Framework object]</value>
|
||||||
</data>
|
</data>
|
||||||
|
@ -67,5 +67,6 @@
|
|||||||
<PackageReference Include="EntityFramework" Version="6.4.4" />
|
<PackageReference Include="EntityFramework" Version="6.4.4" />
|
||||||
<PackageReference Include="System.Drawing.Common" Version="7.0.0" />
|
<PackageReference Include="System.Drawing.Common" Version="7.0.0" />
|
||||||
<PackageReference Include="System.Runtime.CompilerServices.Unsafe" Version="6.0.0" />
|
<PackageReference Include="System.Runtime.CompilerServices.Unsafe" Version="6.0.0" />
|
||||||
|
<PackageReference Include="ZXing.Net.Bindings.Windows.Compatibility" Version="0.16.12" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
Loading…
Reference in New Issue
Block a user