This commit is contained in:
Chenx221 2023-09-02 13:08:33 +08:00
parent bf873ce0c8
commit 434814a085
7 changed files with 181 additions and 90 deletions

13
OTP/Form1.Designer.cs generated
View File

@ -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;
} }
} }

View File

@ -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
{ {

View File

@ -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
View File

@ -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;
} }
} }

View File

@ -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:
else // 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)
{ {
StartCamera(); // 启动摄像头 // Open capture device:
this.captureDevice = await descriptor0.OpenAsync(
characteristics,
this.OnPixelBufferArrived);
// Start capturing.
await this.captureDevice.StartAsync();
} }
} }
}
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())
{
// 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;
}
} }
} }

View File

@ -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>

View File

@ -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>