The camera scanning function has unpredictable issues, and repairing it is currently not being considered. The clipboard import feature has been implemented.
This commit is contained in:
Chenx221 2023-08-22 19:12:19 +08:00
parent b1b87ad724
commit a3b6fde6a6
2 changed files with 101 additions and 37 deletions

43
OTP/Form3.Designer.cs generated
View File

@ -42,8 +42,9 @@
this.label4 = new System.Windows.Forms.Label(); this.label4 = new System.Windows.Forms.Label();
this.label5 = new System.Windows.Forms.Label(); this.label5 = new System.Windows.Forms.Label();
this.groupBox1 = new System.Windows.Forms.GroupBox(); this.groupBox1 = new System.Windows.Forms.GroupBox();
this.pictureBox1 = new System.Windows.Forms.PictureBox();
this.button7 = new System.Windows.Forms.Button(); this.button7 = new System.Windows.Forms.Button();
this.pictureBox1 = new System.Windows.Forms.PictureBox();
this.label6 = new System.Windows.Forms.Label();
this.groupBox1.SuspendLayout(); this.groupBox1.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.pictureBox1)).BeginInit();
this.SuspendLayout(); this.SuspendLayout();
@ -138,6 +139,7 @@
this.button6.TabIndex = 9; this.button6.TabIndex = 9;
this.button6.Text = "Import from Clipboard"; this.button6.Text = "Import from Clipboard";
this.button6.UseVisualStyleBackColor = true; this.button6.UseVisualStyleBackColor = true;
this.button6.Click += new System.EventHandler(this.button6_Click);
// //
// label3 // label3
// //
@ -168,6 +170,7 @@
// //
// groupBox1 // groupBox1
// //
this.groupBox1.Controls.Add(this.label6);
this.groupBox1.Controls.Add(this.button7); this.groupBox1.Controls.Add(this.button7);
this.groupBox1.Controls.Add(this.pictureBox1); this.groupBox1.Controls.Add(this.pictureBox1);
this.groupBox1.Controls.Add(this.label4); this.groupBox1.Controls.Add(this.label4);
@ -180,6 +183,22 @@
this.groupBox1.TabStop = false; this.groupBox1.TabStop = false;
this.groupBox1.Text = "Debug Info"; this.groupBox1.Text = "Debug Info";
// //
// button7
//
this.button7.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom)
| System.Windows.Forms.AnchorStyles.Left)
| System.Windows.Forms.AnchorStyles.Right)));
this.button7.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
this.button7.Location = new System.Drawing.Point(366, 162);
this.button7.MinimumSize = new System.Drawing.Size(75, 75);
this.button7.Name = "button7";
this.button7.Size = new System.Drawing.Size(75, 75);
this.button7.TabIndex = 15;
this.button7.Text = "Pause";
this.button7.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
this.button7.UseVisualStyleBackColor = true;
this.button7.Click += new System.EventHandler(this.button7_Click);
//
// pictureBox1 // pictureBox1
// //
this.pictureBox1.Location = new System.Drawing.Point(105, 113); this.pictureBox1.Location = new System.Drawing.Point(105, 113);
@ -189,21 +208,14 @@
this.pictureBox1.TabIndex = 14; this.pictureBox1.TabIndex = 14;
this.pictureBox1.TabStop = false; this.pictureBox1.TabStop = false;
// //
// button7 // label6
// //
this.button7.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) this.label6.AutoSize = true;
| System.Windows.Forms.AnchorStyles.Left) this.label6.Location = new System.Drawing.Point(8, 146);
| System.Windows.Forms.AnchorStyles.Right))); this.label6.Name = "label6";
this.button7.Font = new System.Drawing.Font("Microsoft Sans Serif", 48F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(0))); this.label6.Size = new System.Drawing.Size(91, 91);
this.button7.Location = new System.Drawing.Point(366, 162); this.label6.TabIndex = 16;
this.button7.MinimumSize = new System.Drawing.Size(75, 75); this.label6.Text = "Note:\r\n使用相机扫码会\r\n自动填充内容到\r\n输入框\r\n因为坑比较多不\r\n好填所以这个\r\n功能不是很完善";
this.button7.Name = "button7";
this.button7.Size = new System.Drawing.Size(75, 75);
this.button7.TabIndex = 15;
this.button7.Text = "●";
this.button7.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
this.button7.UseVisualStyleBackColor = true;
this.button7.Click += new System.EventHandler(this.button7_Click);
// //
// Form3 // Form3
// //
@ -256,5 +268,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.Label label6;
} }
} }

View File

@ -9,9 +9,11 @@ using System.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Windows.Forms; using System.Windows.Forms;
using System.IO;
using ZXing; using ZXing;
using AForge.Video; using AForge.Video;
using AForge.Video.DirectShow; using AForge.Video.DirectShow;
using System.Drawing.Imaging;
namespace OTP namespace OTP
{ {
@ -24,6 +26,7 @@ namespace OTP
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;
public Form3() public Form3()
{ {
@ -35,8 +38,11 @@ namespace OTP
private void Form3_FormClosing(object sender, FormClosingEventArgs e) private void Form3_FormClosing(object sender, FormClosingEventArgs e)
{ {
StopCapturing(); // 关闭窗口时停止截图 StopCapturing(); // 关闭窗口时停止截图
if (isCameraRunning)
{
StopCamera(); // 关闭窗口时停止摄像头 StopCamera(); // 关闭窗口时停止摄像头
} }
}
private void button1_Click(object sender, EventArgs e) private void button1_Click(object sender, EventArgs e)
{ {
@ -132,7 +138,6 @@ namespace OTP
ScreenCapturer.StopCapture(); // 停止截图 ScreenCapturer.StopCapture(); // 停止截图
} }
private void ScanQRCode(Bitmap bitmap) private void ScanQRCode(Bitmap bitmap)
{ {
// 创建二维码读取器实例 // 创建二维码读取器实例
@ -149,7 +154,7 @@ namespace OTP
// 判断是否符合期望的格式 // 判断是否符合期望的格式
if (decodedText.StartsWith("otpauth://totp/") && decodedText.Contains("?secret=")) if (decodedText.StartsWith("otpauth://totp/") && decodedText.Contains("?secret="))
{ {
if (!isLocalfile) if (!isLocalfile && !isScanningPaused)
{ {
StopCapturing(); StopCapturing();
this.Invoke((MethodInvoker)(() => label5.Text = "Stopped")); this.Invoke((MethodInvoker)(() => label5.Text = "Stopped"));
@ -168,6 +173,7 @@ namespace OTP
this.Invoke((MethodInvoker)(() => textBox1.Text = title)); this.Invoke((MethodInvoker)(() => textBox1.Text = title));
this.Invoke((MethodInvoker)(() => textBox2.Text = secretKey)); this.Invoke((MethodInvoker)(() => textBox2.Text = secretKey));
this.Invoke((MethodInvoker)(() => label4.Text = "Success")); this.Invoke((MethodInvoker)(() => label4.Text = "Success"));
//StopCamera();
} }
else else
{ {
@ -185,6 +191,10 @@ namespace OTP
{ {
label3.Text = "None"; label3.Text = "None";
label4.Text = "QR code not detected."; label4.Text = "QR code not detected.";
}else if (isScanningPaused)
{
this.Invoke((MethodInvoker)(() => label3.Text = "None"));
this.Invoke((MethodInvoker)(() => label4.Text = "QR code not detected."));
} }
} }
} }
@ -210,30 +220,37 @@ namespace OTP
private void button5_Click(object sender, EventArgs e) private void button5_Click(object sender, EventArgs e)
{ {
if (!isCameraRunning) isScanningPaused = false;
button7.Text = "Pause";
if (isCameraRunning)
{
StopCamera(); // 停止摄像头
}else
{ {
StartCamera(); // 启动摄像头 StartCamera(); // 启动摄像头
} }
else
{
StopCamera(); // 停止摄像头
}
} }
private void StartCamera() private void StartCamera()
{
if (!isCameraRunning) // 添加条件检查摄像头是否已经在运行
{ {
if (videoDevices != null && videoDevices.Count > 0) if (videoDevices != null && videoDevices.Count > 0)
{
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
//button5.Text = "Stop Camera"; // 更新按钮文本
} }
else else
{ {
MessageBox.Show("No camera device found."); MessageBox.Show("No camera device found.");
} }
} }
}
private void StopCamera() private void StopCamera()
{ {
@ -242,22 +259,29 @@ namespace OTP
camera.SignalToStop(); camera.SignalToStop();
camera.WaitForStop(); camera.WaitForStop();
camera.NewFrame -= Camera_NewFrame; // 取消注册摄像头捕获图像的事件 camera.NewFrame -= Camera_NewFrame; // 取消注册摄像头捕获图像的事件
camera = null; // 将摄像头对象置为null以便下次重新创建
isCameraRunning = false; // 设置摄像头运行状态为 false isCameraRunning = false; // 设置摄像头运行状态为 false
//button5.Text = "Start Camera"; // 更新按钮文本 isScanningPaused = false;
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)
{ {
pictureBox1.Image = bitmap; if (previousBitmap != null)
}else {
previousBitmap.Dispose();
}
pictureBox1.Image = bitmap;
previousBitmap = bitmap;
}
else
{ {
// 进行二维码扫描
ScanQRCode(bitmap); ScanQRCode(bitmap);
bitmap.Dispose();
} }
} }
@ -266,5 +290,32 @@ namespace OTP
isScanningPaused = !isScanningPaused; isScanningPaused = !isScanningPaused;
button7.Text = isScanningPaused ? "Resume" : "Pause"; button7.Text = isScanningPaused ? "Resume" : "Pause";
} }
private void button6_Click(object sender, EventArgs e)
{
string clipboardText = Clipboard.GetText();
if (!string.IsNullOrWhiteSpace(clipboardText) &&
clipboardText.StartsWith("otpauth://totp/") &&
clipboardText.Contains("?secret="))
{
string[] parts = clipboardText.Split(new char[] { '/', '=', '&', '?' });
if (parts.Length >= 6)
{
string title = parts[3]; // 获取 title 部分
string secretKey = parts[5]; // 获取 secretKey 部分
MessageBox.Show("OTP link successfully pasted.");
// 填充文本框
textBox1.Text = title;
textBox2.Text = secretKey;
}
}
else
{
MessageBox.Show("Clipboard content is not a valid OTP link.");
}
}
} }
} }