c#窗体应用程序实现当软件开启,就在数据库扫描是否有设置的良品和不良品条码的当天ICT测试记录(ICT_test表中Barcode,Date,Result),良品和不良品条码在本地文件夹txt文件中获取。如果数据库中有良品和不良品测试记录存在,lable状态栏变绿并提示“已点检,请进行ICT测试”,然后进行别的条码的ICT测试。就将扫到的条码通过模拟键盘发送到ICT测试软件进行测试。如果没有,别的条码发送时会被拦截,label状态栏变红,并提示“请进行测试前点检”,然后就先进行设置条码的ICT测试,判断扫描到txt_Barcode中条码是否为获取到设置的良品或不良品条码,如输入的条码不符合,label状态栏变红,并提示“条码错误”,如输入的条码正确并为设置的良品条码,label状态栏变绿,并提示“请进行良品点检”,就将良品条码发送到ICT测试软件进行ICT测试,当发现某一文件夹中有良品测试报告生成,表示良品测试完成,测试完成后就提示“良品点检完成”。如扫描的是设置的不良品条码,则label状态栏变绿,并提示“请进行不良品点检”,进行ICT测试。当发现某一文件夹中有不良品测试报告生成,表示不良品测试完成。(所有条码先扫描到c#窗体软件txt_barcode中,在通过模拟键盘定位发送到ICT测试软件条码框中,然后进行ICT测试)代码实现
时间: 2023-11-27 16:06:20 浏览: 68
首先,需要引入以下命名空间:
```
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
using System.Diagnostics;
using System.Threading;
```
然后,在窗体中添加一个Label控件,用于显示状态,一个TextBox控件,用于输入条码,以及一个Button控件,用于触发发送条码的事件。具体代码如下:
```
public partial class Form1 : Form
{
private bool isCheckPassed = false; // 是否通过点检
private bool isTesting = false; // 是否正在进行测试
private string goodBarcodeFile = "good_barcodes.txt"; // 良品条码文件名
private string badBarcodeFile = "bad_barcodes.txt"; // 不良品条码文件名
private List<string> goodBarcodes = new List<string>(); // 良品条码列表
private List<string> badBarcodes = new List<string>(); // 不良品条码列表
private string ictTestAppPath = "ICTTestApp.exe"; // ICT测试软件路径
private string ictTestAppWindowTitle = "ICT Test App"; // ICT测试软件窗口标题
public Form1()
{
InitializeComponent();
// 初始化良品和不良品条码列表
if (File.Exists(goodBarcodeFile))
{
goodBarcodes = File.ReadAllLines(goodBarcodeFile).ToList();
}
if (File.Exists(badBarcodeFile))
{
badBarcodes = File.ReadAllLines(badBarcodeFile).ToList();
}
// 设置状态栏为红色
SetStatusLabelColor(Color.Red);
SetStatusLabelText("请进行测试前点检");
}
private void buttonSendBarcode_Click(object sender, EventArgs e)
{
// 如果正在测试,则不做任何处理
if (isTesting)
{
return;
}
// 获取输入的条码
string barcode = textBoxBarcode.Text.Trim();
// 如果未通过点检,则进行点检
if (!isCheckPassed)
{
if (goodBarcodes.Contains(barcode))
{
// 如果是良品条码,则进行良品点检
SetStatusLabelColor(Color.Green);
SetStatusLabelText("请进行良品点检");
SendBarcodeToICTTestApp(barcode);
}
else if (badBarcodes.Contains(barcode))
{
// 如果是不良品条码,则进行不良品点检
SetStatusLabelColor(Color.Green);
SetStatusLabelText("请进行不良品点检");
SendBarcodeToICTTestApp(barcode);
}
else
{
// 如果不是设置的良品或不良品条码,则提示条码错误
SetStatusLabelColor(Color.Red);
SetStatusLabelText("条码错误");
}
}
else
{
// 如果已经通过点检,则进行测试
SendBarcodeToICTTestApp(barcode);
}
}
private void SendBarcodeToICTTestApp(string barcode)
{
// 启动ICT测试软件
Process.Start(ictTestAppPath);
// 等待ICT测试软件启动完成
while (true)
{
IntPtr windowHandle = Win32.FindWindow(null, ictTestAppWindowTitle);
if (windowHandle != IntPtr.Zero)
{
break;
}
Thread.Sleep(100);
}
// 将条码发送到ICT测试软件
Win32.SetForegroundWindow(ictTestAppWindowTitle);
SendKeys.SendWait(barcode);
SendKeys.SendWait("{ENTER}");
// 标记正在进行测试
isTesting = true;
// 启动一个线程来检测测试是否完成
new Thread(() =>
{
while (true)
{
// 检查文件夹中是否有测试报告生成
bool isGoodTestReportExist = Directory.GetFiles("good_test_reports").Length > 0;
bool isBadTestReportExist = Directory.GetFiles("bad_test_reports").Length > 0;
if (isGoodTestReportExist)
{
// 如果是良品测试,则提示良品点检完成
SetStatusLabelColor(Color.Green);
SetStatusLabelText("良品点检完成");
isCheckPassed = false;
isTesting = false;
break;
}
else if (isBadTestReportExist)
{
// 如果是不良品测试,则提示不良品点检完成
SetStatusLabelColor(Color.Green);
SetStatusLabelText("不良品点检完成");
isCheckPassed = false;
isTesting = false;
break;
}
Thread.Sleep(1000);
}
}).Start();
}
private void SetStatusLabelColor(Color color)
{
if (InvokeRequired)
{
Invoke(new Action(() =>
{
labelStatus.ForeColor = color;
}));
}
else
{
labelStatus.ForeColor = color;
}
}
private void SetStatusLabelText(string text)
{
if (InvokeRequired)
{
Invoke(new Action(() =>
{
labelStatus.Text = text;
}));
}
else
{
labelStatus.Text = text;
}
}
}
```
其中,`Win32`类是一个静态类,用于调用Windows API。具体实现如下:
```
public static class Win32
{
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern IntPtr FindWindow(string strClassName, string strWindowName);
[DllImport("user32.dll", CharSet = CharSet.Auto)]
public static extern bool SetForegroundWindow(IntPtr hWnd);
}
```
注意,为了确保ICT测试软件已经启动,并且处于前台,需要调用`FindWindow`和`SetForegroundWindow`函数。另外,为了避免UI线程被阻塞,需要在发送条码的事件中启动一个线程来检测测试是否完成。
阅读全文