Passing information between two program instances

I am developing a command line program which needs to get information from command line switches every now and then. So instead of starting a new instance when the program is executed, it will pass an event or message to the already running program telling it what it would do.

For example:

First program.exe is executed and the program is started. Then we run program.exe /cleardatabase and the running process receives this
request and acts accordingly.

It's the messaging part that's troublesome. I've looked into the windows API(GetMessage, SendMessage) but I haven't been able to create a C# solution, and I don't think there are stuff in the .NET framework for this..

It's pretty normal for a program to act this way, but I haven't been able to find a tutorial on the matter..

What I need is a C# solution that checks if the program is running, if it is, send a message containing a string to it which the main program then can interpret. Thanks!
c03dnAsked:
Who is Participating?

[Webinar] Streamline your web hosting managementRegister Today

x
 
jjacksnConnect With a Mentor Commented:
c03dn, if its just something quick and dirty, you can easily send windows messages in .NET.  


to listen for them, override WndProc

protected override void WndProc(ref Message aMessage)
{
      if(aMessage.Msg == your message)
      {
            //do something
      }
else
{
base.WndProc(ref aMessage);
}

to send them, just use:

[DllImport("user32.dll")]
private static extern int SendMessage(IntPtr hWnd, int command, int lPARAM, int WParam);
            
0
 
cookreCommented:
0
 
gregoryyoungCommented:
wow there are a tons of ways of doing this ...

1) Do you only need it to work on the same machine ?
2) Do you need gaurenteed delivery of messages (even if first program is hung etc)
0
Never miss a deadline with monday.com

The revolutionary project management tool is here!   Plan visually with a single glance and make sure your projects get done.

 
cookreCommented:
jjacksn - I had no idea you could get to WndProc() like that.  Wunnerful.

(and all this time I've been doing all the old stuff (InitInstance() CreateWindow()... to a hidden window just to get a message pump)
 Live and learn.  Tnx...

c03dn - this is the way to go.  Make up your own message number above the value of 0x0400 (WM_USER).
0
 
jjacksnCommented:
cookre, if it makes you feel better, I had no idea about MSMQ and found that very interesting reading.  Although it is totally overkill for a small app.  

c03dn - FYI, at the tyop of WinProc you should filter out everything

if(aMessage.Msg < 0x0400)
{
base.WndProc(ref aMessage)

}
else
{

}

otherwise debugging is a royal pain because the focus message gets sent everytime you step through the function in the debugger.  its also just good practice.  
0
 
c03dnAuthor Commented:
I'm looking into the windows messages now. Is it possible to send a string with sendmessage or just a code? I am sorry if my questions are newbieish, it's my first shot at this..
0
 
c03dnAuthor Commented:
Also, how do I use the WndProc in a console environment? It complains about "Message" not being found..

I've found examples on msdn, but they're all of window forms..
0
 
cookreCommented:
The standard window message adjuncts, wParam and lParam, are passed along in the aMessage object:

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemwindowsformsmessagememberstopic.asp?frame=true ,

but the standard windows message has no built-in mechanism for passing arbitrarily sized info.
0
 
c03dnAuthor Commented:
Got it working now.

Now I'll just have to find out how to get a window handle with just knowing the process name.. The program is going to be used to maintain focus on certain programs. Thanks again!
0
 
jjacksnCommented:
c03dn, you're in luck:

Process[] procs = Process.GetProcesses();

int len = procs.GetLength(0);
for (int i=0; i<len; i++)
{
               Process p = procs[i];
               if (p.Id!=0)
                        {
                              if(iCurrentProcessId == p.Id) continue; //that's this program.

                              if(p.ProcessName == "your name")
                              {
                                    p.MainWindowHandle; //do something with that
                                    
                              }
                        }
                  }
0
 
cookreCommented:
Or, if both programs are your code, message the pid back.
0
 
jjacksnCommented:
that's cool, I didn't know that.  when are you allowed to see processes on another machine?
0
All Courses

From novice to tech pro — start learning today.