2014-12-19 4 views
2

CMD 터미널의 전경에서 Windows으로 실행되고 사용자 키 입력을받는 C 콘솔 응용 프로그램이 있습니다. 그러나 이제는 배경으로 이동해야하며 사용자 입력이 필요 없습니다.C 프로그램을 C# 시스템 트레이 응용 프로그램에서 스레드로 실행하려면 어떻게해야합니까?

마우스 오른쪽 버튼 클릭으로 올바르게 구현 된 시스템 트레이를 만들었으며 마우스 오른쪽 버튼을 클릭하십시오. 그리고 그 기능을하는 터미널 프로그램을 가지고.

프로그램을 다시 작성하는 대신 터미널이 필요없는 기존 프로그램의 함수를 호출하는 스레드를 만들 수 있기를 원합니다.

단지 콘솔의 대화 형 기능이 키 스트로크 등에 대한 응용 프로그램의 응답과 같이 코드에서 제거되었다는 점을 강조하기 바란다.

질문 : 가능합니까? 어떻게 구현할 수 있습니까?

+2

* C 프로그램 *은 너무 막연합니다. C *로 작성된 * 콘솔 응용 프로그램을 의미하는 것으로 추측합니다.이 경우 대답은 * no *이고 콘솔 응용 프로그램은 수정하지 않고 트레이 응용 프로그램으로 실행할 수 없습니다. 콘솔 응용 프로그램에없는 알림을 수신하려면 최소한 윈도우 핸들과 메시지 루프가 있어야합니다. –

+0

대답이 충분하지 않더라도 .... .NET 프로그램이 백그라운드에서 콘솔 응용 프로그램을 시작할 수 있습니다. –

+0

@Keith : 그것은 질문이 묻는 것 인 트레이 응용 프로그램이 아닙니다. –

답변

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과 함께 시작해 볼 수도 있지만 너무 많이 사용한다고 말할 수 있습니다. 이것은 당신이 무엇을 요구하는 경우

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

저는 그가 자신의 실행 파일에 전화하기를 100 % 확신하지 못했습니다. 나는 그가 특정 함수 또는 그의 실행 파일로 컴파일 된 특정 함수를 호출하기를 원할지도 모른다고 생각한다. – Icemanind

+0

@rodrigogq 제 문제에 대한 더 나은 해결책은 DLL 함수를 호출하는 스레드를 만드는 것입니다. 귀하의 대답은 약간 다른 응용 프로그램에 사용할 수 있지만 자동화가 필요합니다. 건배 – Luke

1

당신은 System.Diagnostics 네임을 통해 .NET 코드에서 C 프로그램을 시작할 수 있습니다 (I 일반적으로 .NET은 나에게 매우 외국 그래서 더 임베디드 C를 사용하여 PC 프로그래머 아닙니다. 어떤 도움을 크게 감사합니다). 방법. 별도의 프로세스로 실행됩니다.

당신은 .NET 코드뿐만 아니라

바와 같이 이미 게시
+0

질문은 시스템 트레이 응용 프로그램에 대해 묻습니다 * 'Process'를 통해 실행되는 콘솔 응용 프로그램과 다릅니다. –

4

잘 모르겠어요,하지만 당신은 C# 응용 프로그램에서 C 프로그램에서 함수를 호출 할 수 있는지 묻는 경우 : 이것은 당신의 C# 트레이 응용 프로그램 제어하지 않고 다른 프로세스를 시작할 것이다 , 그럴 수 있습니다. C 프로그램의 소스 코드를 가지고있는 한. C에서 함수를 C# 프로그램에서 사용할 수 있으려면 해당 함수를 내 보내야합니다.

#include <iostream> 

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

가 뭐죠 중요한 여기 함수는 extern "C" 블록에 싸여 있다는 점이다

MyAddDll.h : 나는 당신에게 예를 보여줍니다. 기본적으로 컴파일러는 함수의 이름을 맹 글링하지 말아야한다. 다른 중요한 부분은 __declspec(dllexport)입니다. 이것은이 함수를 다른 프로그램 (예 : C# 프로그램)에서 호출 할 수 있도록 함수를 내 보내려한다는 것을 컴파일러에 알립니다.

MyAddDll.

#include <iostream> 
#include "MyAddDll.h" 

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

CPP

는 다시 코드는 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)); 
    } 
} 

!

하나의 "잡았다"하지만 C 프로그램과 C# 프로그램이 모두 32 비트 또는 64 비트로 컴파일되었는지 확인해야합니다. C 프로그램을 64 비트로 컴파일하고 C# 프로그램을 32 비트로 컴파일 할 수 없습니다. 둘 다 동일한 비트 길이를 사용해야합니다.

+0

안녕하세요 고맙습니다. 매우 도움이됩니다. 만약 내가 여러 개의 C 파일이 있다면 그들은 모두 DLL에 래핑되어야합니까 아니면 내가 다른 C 파일을 호출 할 수있는 DLL로 주 래핑하면? – Luke

+1

@ 루크 - C#에서 호출 할 수있는 기능을 포함하는 모든 C 파일을 래핑해야합니다. – Icemanind

+0

감사합니다. 이는 변경을 구현하는 데 도움이됩니다. 건배 – Luke