Link to home
Start Free TrialLog in
Avatar of c03dn
c03dn

asked on

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!
Avatar of cookre
cookre
Flag of United States of America image

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)
ASKER CERTIFIED SOLUTION
Avatar of jjacksn
jjacksn

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
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).
Avatar of jjacksn
jjacksn

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.  
Avatar of c03dn

ASKER

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..
Avatar of c03dn

ASKER

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..
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.
Avatar of c03dn

ASKER

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!
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
                                    
                              }
                        }
                  }
Or, if both programs are your code, message the pid back.
that's cool, I didn't know that.  when are you allowed to see processes on another machine?