如何从C#系统托盘应用程序中将C程序作为线程运行?

时间:2014-12-19 01:53:42

标签: c# c windows multithreading system-tray

我有一个C控制台应用程序,它曾经在CMD Windows终端的前台运行并获取用户按键输入。但是现在需要将其移动到后台并且不需要用户输入。

我创建了一个系统托盘,右键单击退出并右键单击即可正确实现。并有一个终端程序来完成功能。

我希望能够创建一个调用现有程序中不需要终端的函数的线程,而不是重新编写程序。

只是强调控制台交互方面已从代码中删除,因为应用程序响应了击键等。希望这可以略微澄清事情。

问题:这可能吗?我怎么能实现这个呢?

(我通常不是使用更多嵌入式C的PC程序员,所以.NET对我来说很陌生。非常感谢任何帮助)

3 个答案:

答案 0 :(得分:4)

我不确定这是不是你问的问题,但如果你问是否可以从C#应用程序调用C程序中的函数,那么你可以。只要你有C程序的源代码。为了使C语言中的函数可用于C#程序,必须导出它们。我会告诉你一个例子:

MyAddDll.h

#include <iostream>

extern "C"
{
    __declspec(dllexport) int Add(int a, int b);
}

这里重要的是你的函数包含在extern "C"块中。基本上,这告诉编译器不要破坏你的函数名称。另一个重要的部分是__declspec(dllexport)。这告诉编译器您要导出此函数,以便可以从其他程序(如C#程序)调用它。

MyAddDll.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#调用它,它很直接:

MyProgram.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));
    }
}

那就是全部!

一个&#34;陷阱&#34;虽然确保您的C程序和C#程序都编译为32位或64位。您不能将C程序编译为64位,将C#程序编译为32位。它们必须使用相同的位长。

答案 1 :(得分:3)

如上所述,您可以使用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

有些程序员要小心谨慎。如果需要任何输入,那么您的进程可能会暂停。确保没有真正停止你的程序。

您也可以尝试使用cmd启动Process.Start命令,但我会说它太多了。如果没有C#托盘应用程序控件,这将启动另一个进程:

 Process.Start("start /min cmd /c mycommand");

答案 2 :(得分:1)

您可以通过System.Diagnostics.Process从.NET代码启动您的C程序。它将在一个单独的过程中运行。

您也可以从.NET代码中删除该进程