2014-12-19 3 views
2

У меня есть консольное приложение C, которое раньше выполнялось на переднем плане в терминале CMD в Windows и вводило пользовательские ввод нажатий клавиш. Однако теперь его нужно переместить на задний план и не требует ввода пользователем.Как запустить программу C в виде потока из приложения системного лотка C#?

Я создал системный лоток, который был правильно реализован с правом щелчка правой кнопкой мыши и щелкнул правой кнопкой мыши. И иметь терминальную программу, которая выполняет эту функцию.

Вместо повторной перезагрузки программы я хотел бы иметь возможность создавать поток, который вызывает функции из моей существующей программы, которые не требуют терминала.

Просто для того, чтобы подчеркнуть, что консольные интерактивные аспекты были удалены из кода, так как реакция приложений на нажатия клавиш и т. Д. Надеюсь, это немного прояснит ситуацию.

Вопрос: Возможно ли это? И как я смогу это реализовать?

(Я вообще не программист ПК с использованием более встроенных C, так .NET вполне чуждо мне. Любая помощь очень ценится)

+2

Программа A * C * слишком расплывчата. Я предполагаю, что вы имеете в виду консольное приложение *, написанное на C *, и в этом случае ответ будет * no *, консольное приложение не может быть запущено в качестве приложения для лотков без изменений; он должен был бы хотя бы иметь дескриптор окна и цикл сообщений, чтобы получать уведомления, которых нет в консольных приложениях. –

+0

недостаточно информации для ответа .... но возможно, что ваша программа .NET запустит консольное приложение в фоновом режиме. –

+0

@Keith: Это не приложение для лотков, но это вопрос. –

ответ

3

Как уже писал, вы можете использовать Process.Start из вашего лотка # приложения C.

// 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"); 
+0

Я не уверен на 100%, что он хочет назвать его исполняемый файл. Я думаю, он может захотеть вызвать определенную функцию или конкретные функции, которые скомпилированы в его исполняемый файл. – Icemanind

+0

@rodrigogq Я думаю, что лучшим решением для моей проблемы является создание потока, который вызывает функции DLL. Хотя ваш ответ я мог бы использовать для немного другого приложения, мне также нужно автоматизировать. Приветствия – Luke

1

Вы могли бы начать C программу из кода .NET с помощью System.Diagnostics. Обработать. Он будет запускаться в отдельном процессе.

Вы можете убить процесс из кода .NET, а

+0

В этом вопросе возникает вопрос о приложении * в системном трее *, который не совпадает с консольным приложением, запущенным с помощью 'Process'. –

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.каст

#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)); 
    } 
} 

Это все есть!

Один из них «gotcha», хотя убедитесь, что ваша программа на C и ваша программа C# скомпилированы либо как 32-разрядные, либо 64-разрядные. Вы не можете скомпилировать свою программу на C как 64-битную, а вашу программу на C# - как 32-разрядную. Оба они должны использовать одну и ту же длину бит.

+0

Привет, спасибо, что это очень полезно. Если у меня есть несколько файлов C, все они должны быть обернуты в DLL, или если я оберну их основной, так как DLL может вызвать другие C-файлы? – Luke

+1

@ Luke - Любые файлы C, содержащие функции, которые вы хотите иметь возможность вызова на C#, должны быть обернуты – Icemanind

+0

Спасибо. Это должно быть полезно при реализации изменения. Cheers – Luke