如何从 C# 系统托盘应用程序将 C 程序作为线程运行
本文关键字:程序 运行 线程 应用程序 系统 | 更新日期: 2023-09-27 18:34:37
我有一个C控制台应用程序,它曾经在Windows
的CMD
终端的前台运行,并接受用户击键输入。但是,它现在需要移动到后台,并且不需要用户输入。
我创建了一个系统托盘,通过右键单击退出和右键单击"关于"正确实现。并有一个终端程序来执行该功能。
与其再次重写程序,我希望能够创建一个线程,该线程调用我现有程序中不需要终端的函数。
只是为了强调这一点,控制台交互方面已从代码中删除,应用程序对击键等的响应也是如此。 希望这能稍微澄清一下。
问:这可能吗?我将如何实现这一点?
(我通常不是一个使用更多嵌入式C的PC程序员,所以.NET对我来说很陌生。任何帮助将不胜感激(
我不确定这是否是你要问的,但如果你问你是否可以从 C# 应用程序调用 C 程序中的函数,那么你可以。只要你有C程序的源代码。为了使 C 中的函数可用于 C# 程序,必须导出这些函数。我给你看一个例子:
MyAddDll.h
#include <iostream>
extern "C"
{
__declspec(dllexport) int Add(int a, int b);
}
这里重要的是你的函数被包装在一个extern "C"
块中。基本上,这告诉编译器不要破坏函数的名称。另一个重要的部分是 __declspec(dllexport)
.这会告知编译器要导出此函数,以便可以从其他程序(如 C# 程序(调用它。
我的添加Dll.cpp
#include <iostream>
#include "MyAddDll.h"
extern "C"
{
__declspec(dllexport) int Add(int a, int b)
{
return (a + b);
}
}
同样,您的代码被包装在 extern "C"
块中,您需要向函数添加__declspec(dllexport)
。现在,您可以将其编译为 DLL 文件或 EXE 文件。现在从 C# 调用它,它非常简单:
我的程序.cs
class Program
{
[DllImport("c:''PathToMyDllOrExeFile''MyAddDll.dll")]
public static extern int Add(int val1, int val2);
static void Main(string[] args)
{
int val1 = 12;
int val2 = 4;
Console.WriteLine("{0} + {1} = {2}", val1, val2, Add(val1, val2));
}
}
仅此而已!
不过,一个"陷阱"是确保 C 程序和 C# 程序都编译为 32 位或 64 位。不能将 C 程序编译为 64 位,将 C# 程序编译为 32 位。它们必须使用相同的位长度。
如前所述,您可以使用 C# 应用程序托盘中的Process.Start
。
// Uses the ProcessStartInfo class to start new processes,
// both in a minimized mode.
void OpenWithStartInfo()
{
ProcessStartInfo startInfo = new ProcessStartInfo("IExplore.exe");
startInfo.WindowStyle = ProcessWindowStyle.Minimized;
Process.Start(startInfo);
startInfo.Arguments = "www.northwindtraders.com";
Process.Start(startInfo);
}
http://msdn.microsoft.com/en-us/library/53ezey2s(v=vs.110(.aspx
您可以尝试在隐藏状态下启动它:http://msdn.microsoft.com/en-us/library/system.diagnostics.processwindowstyle(v=vs.110(.aspx
一些程序员告诉要小心。如果预期有任何输入,则您的进程可能会停止。确保没有任何东西真正停止您的程序。
您也可以尝试使用 Process.Start
启动 cmd
命令,但我会说这太多了。这将在没有 C# 托盘应用程序控制的情况下启动另一个进程:
Process.Start("start /min cmd /c mycommand");
您可以通过 System.Diagnostics.Process 从 .NET 代码启动 C 程序。它将在单独的进程中运行。
您也可以从 .NET 代码中终止该过程