我有一个控制台应用程序在后台执行某些操作,我想这样做,以便用户可以更改控制台应用程序正在执行的操作。
我想添加一个Windows窗体应用程序来获取用户输入并将其发送到控制台应用程序以供使用。我已经看过,无法找到我正在寻找的东西
我发现了这个问题 - Add GUI to Existing Code in Visual Studio - 但这对我没什么帮助。
我有这个:
const [input, progress, label] = [
document.querySelector("input")
, document.querySelector("progress")
, document.querySelector("label")
];
const url = "/path/to/server/";
input.onmousedown = () => {
label.innerHTML = "";
progress.value = "0"
};
input.onchange = (event) => {
const file = event.target.files[0];
const filename = file.name;
progress.max = file.size;
const request = new Request(url, {
method: "POST",
body: file,
cache: "no-store"
});
const upload = settings => fetch(settings);
const uploadProgress = new ReadableStream({
start(controller) {
console.log("starting upload, request.bodyUsed:", request.bodyUsed);
controller.enqueue(request.bodyUsed);
},
pull(controller) {
if (request.bodyUsed) {
controller.close();
}
controller.enqueue(request.bodyUsed);
console.log("pull, request.bodyUsed:", request.bodyUsed);
},
cancel(reason) {
console.log(reason);
}
});
const [fileUpload, reader] = [
upload(request)
.catch(e => {
reader.cancel();
throw e
})
, uploadProgress.getReader()
];
const processUploadRequest = ({value, done}) => {
if (value || done) {
console.log("upload complete, request.bodyUsed:", request.bodyUsed);
// set `progress.value` to `progress.max` here
// if not awaiting server response
// progress.value = progress.max;
return reader.closed.then(() => fileUpload);
}
console.log("upload progress:", value);
progress.value = +progress.value + 1;
return reader.read().then(result => processUploadRequest(result));
};
reader.read().then(({value, done}) => processUploadRequest({value,done}))
.then(response => response.text())
.then(text => {
console.log("response:", text);
progress.value = progress.max;
input.value = "";
})
.catch(err => console.log("upload error:", err));
}
但我想检查是否检查了Windows窗体中的复选框,而不是像这样将其设置为true:
在Windows窗体上的复选框名为CheckOnOrOff并且已被选中。
bool OnOrOff = true;
答案 0 :(得分:0)
我认为你应该设计一个数据库来存储用户输入。您的控制台项目和窗口项目将由此数据库运行和管理。
答案 1 :(得分:0)
您可以从Windows窗体(用户)获取输入,然后使用控制台应用程序中的参数参数将其传递给控制台应用程序。
Main方法的参数是一个String数组,表示命令行参数
所以,如果我有一个像这样的控制台程序(MyCApp.exe):
class Program
{
static void Main(string[] args)
{
foreach (var arg in args)
{
Console.WriteLine(arg);
}
}
}
我从命令行开始这样:
MyCApp.exe Arg1 Arg2 Arg3 Main方法将传递给一个数组 包含三个字符串:" Arg1"," Arg2"," Arg3"。
如果需要传递包含空格的参数,请将其用引号括起来。例如:
MyCApp.exe" Arg 1" " Arg 2" " Arg 3" 当您需要在运行时将信息传递给应用程序时,通常会使用命令行参数。例如,如果您编写的程序传递基本信息以将文件从一个位置复制到另一个位置,则可能会将这两个位置作为命令行参数传递。例如:
MyCApp.exe C:\file1.txt C:\file2.txt Copyit
这里' C:\ file1.txt'是第一个参数,' C:\ file2.txt'是第一个论证,' Copyit'是第三个论点
答案 2 :(得分:0)
我假设用户可以在控制台应用程序运行时更改设置,并且应立即采取效果。在控制台中添加winforms应用程序作为参考将无济于事,因为它将是一个不同的应用程序。所以这就是我的建议:
创建一个新的winforms应用程序,并从“Windows应用程序”中更改输出类型。到控制台应用程序'所以我们可以看到控制台。将控制台逻辑进程移植到winforms项目
添加一个新的静态类,它将在winforms和console之间保存标志。例如:
namespace FormWithConsole {
public static class SharedData {
public static bool Feature01 { get; set; }
}
}
private void checkBox1_CheckedChanged(object sender, EventArgs e) {
SharedData.Feature01 = checkBox1.Checked;
}
Thread thread;
private void button1_Click(object sender, EventArgs e) {
if (thread != null) {
try {
Console.WriteLine("Aborting current process");
thread.Abort();
thread = null
}
catch (ThreadAbortException) { }
}
ConsoleProcess process = new ConsoleProcess();
thread = new Thread(process.StartProcess);
thread.IsBackground = true;
thread.Start();
}
class ConsoleProcess {
public void StartProcess() {
while (true) {
if (SharedData.Feature01) {
// Do something here
}
Console.WriteLine("Regular process here...");
}
}
}
如果您希望将表单最小化到系统托盘,请参阅minimize app to system tray