Array
(
)

Chamar programas apartir de um serviço

Pjava
   - 22 ago 2012

Para chamar, a calculadora do windows, por exemplo, só preciso disso?
protected override void OnStart(string[] args)
{
System.Diagnostics.Process.Start("calc");
}
Se for somente isso, não está funcionando. O que mais preciso informar?

Fabio Rosa
   - 22 ago 2012

Olha,

Acredito que como você está em um serviço, deverá informar o path completo da aplicação, pois as variáveis de sistema não são vistas pelo serviço... Então você não pode informar apenas "Calc" e sim "%windir%\system32\calc.exe"

Tente isto... acho que pode resolver.

Att.

Pjava
   - 23 ago 2012

Fiz conforme abaixo e também não funcionou.

{
public Service1()
{
InitializeComponent();
}

protected override void OnStart(string[] args)
{
Timer timer;
timer = new Timer(new TimerCallback(timer_Tick), null, 15000, 60000);
}

protected override void OnStop()
{
}

private void timer_Tick(object sender)

{
//System.Diagnostics.Process.Start("%windir%\\system32\\calc.exe");
System.Diagnostics.Process.Start("C:\\Windows\\system32\\calc.exe");
}
}

Já coloquei essa linha direto no OnStart e também não funciona

System.Diagnostics.Process.Start("C:\\Windows\\system32\\calc.exe");

Edson Oliveira
   - 23 ago 2012

Tenta isso.
#Código

Process oProcess = null;
ProcessStartInfo oProcessStartInfo = new ProcessStartInfo("C:\WINDOWS\SYSTEM32\CALC.EXE");

string pwd = "mypassword";//
System.Security.SecureString securePwd = new System.Security.SecureString();

foreach (char c in pwd)
    securePwd.AppendChar(c);

oProcessStartInfo.UseShellExecute = false;
oProcessStartInfo.Password = securePwd;
oProcessStartInfo.UserName = "myserviceaccount"; 
oProcessStartInfo.Domain = "MyCompanyDomain"; 

oProcess = Process.Start(oProcessStartInfo);
            
oProcess.WaitForExit();
oProcess.Close();

Pjava
   - 23 ago 2012

Se eu coloco essas linhas, o serviço não starta

//foreach (char c in pwd)
// securePwd.AppendChar(c);

//oProcessStartInfo.UseShellExecute = false;
//oProcessStartInfo.Password = securePwd;
//oProcessStartInfo.UserName = "psilva";
//oProcessStartInfo.Domain = "CasaNova";

E se comento, a calculadora não sobe

Pjava
   - 23 ago 2012

Fiz dessa outra maneira e nada também

System.Timers.Timer MyTimer;

public Service1()
{
InitializeComponent();
}

protected override void OnStart(string[] args)
{

//Tempo para 20 segundos
MyTimer = new System.Timers.Timer(20000);
MyTimer.Elapsed += new ElapsedEventHandler(MyTimer_Elapsed);
MyTimer.Start();
}

void MyTimer_Elapsed(object sender, ElapsedEventArgs e)
{
try
{
MyTimer.Stop();

System.Diagnostics.Process.Start("C:\\Windows\\system32\\calc.exe");
}
catch (Exception)
{
//ALGUM LOG, MAS NÃO DEIXE LEVANTAR A EXCEÇÃO
}
finally
{
MyTimer.Start();
}
}

protected override void OnStop()
{
}

private void timer_Tick(object sender)

{
//System.Diagnostics.Process.Start("%windir%\\system32\\calc.exe");
System.Diagnostics.Process.Start("C:\\Windows\\system32\\calc.exe");
}
}

Pjava
   - 23 ago 2012

Caiu a ficha da seguinte forma. Em realidade está chamando sim, a calculadora, só que eu não visualizo. No gerenciador de tarefas, dá pra var a calc.exe sendo executada, mas não visualizo. O que faço nessas condições?

Pjava
   - 24 ago 2012

Me disseram que o Windows Service pode até chamar um programa, mas não vai mostra-lo sendo executado, ou seja, interagir com o usuário. Isso é verdade? A minha calculadora é executada, mas não aparece na minha tela, daí esses vários posts. É verdade isso?

Edson Oliveira
   - 24 ago 2012

Eu não se tem algum jeito de fazer aparecer o programa, mas você pode criar um projeto console e recebi os argumentos, pode ser assim.

Serviço
#Código

Process oProcess = new Process();

oProcess.EnableRaisingEvents = false;

oProcess.StartInfo.FileName = @"ConsoleApplication1.exe";

oProcess.StartInfo.Arguments = "--calc";

oProcess.Start();


Console
#Código
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            if (args.Length > 0)
            {
                if (args[0] == "--calc")
                {
                    Process.Start("calc.exe");
                }
            }
        }
    }
}


É so colocar o .exe do console junto com o .exe do serviço.