Solved

Passing information between two program instances

Posted on 2004-08-24
14
250 Views
Last Modified: 2010-04-15
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!
0
Comment
Question by:c03dn
  • 5
  • 4
  • 3
  • +1
14 Comments
 
LVL 22

Expert Comment

by:cookre
ID: 11883286
0
 
LVL 37

Expert Comment

by:gregoryyoung
ID: 11888420
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
 
LVL 5

Accepted Solution

by:
jjacksn earned 500 total points
ID: 11888615
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
 
LVL 22

Expert Comment

by:cookre
ID: 11888719
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
 
LVL 5

Expert Comment

by:jjacksn
ID: 11888888
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
 

Author Comment

by:c03dn
ID: 11913803
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
 

Author Comment

by:c03dn
ID: 11913978
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
Find Ransomware Secrets With All-Source Analysis

Ransomware has become a major concern for organizations; its prevalence has grown due to past successes achieved by threat actors. While each ransomware variant is different, we’ve seen some common tactics and trends used among the authors of the malware.

 
LVL 22

Expert Comment

by:cookre
ID: 11914189
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
 
LVL 22

Expert Comment

by:cookre
ID: 11914214
0
 

Author Comment

by:c03dn
ID: 11915594
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
 
LVL 5

Expert Comment

by:jjacksn
ID: 11917158
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
 
LVL 37

Expert Comment

by:gregoryyoung
ID: 11917182
0
 
LVL 22

Expert Comment

by:cookre
ID: 11917261
Or, if both programs are your code, message the pid back.
0
 
LVL 5

Expert Comment

by:jjacksn
ID: 11918290
that's cool, I didn't know that.  when are you allowed to see processes on another machine?
0

Featured Post

Threat Intelligence Starter Resources

Integrating threat intelligence can be challenging, and not all companies are ready. These resources can help you build awareness and prepare for defense.

Join & Write a Comment

Bit flags and bit flag manipulation is perhaps one of the most underrated strategies in programming, likely because most programmers developing in high-level languages rely too much on the high-level features, and forget about the low-level ones. Th…
Article by: Najam
Having new technologies does not mean they will completely replace old components.  Recently I had to create WCF that will be called by VB6 component.  Here I will describe what steps one should follow while doing so, please feel free to post any qu…
This video discusses moving either the default database or any database to a new volume.
In this tutorial you'll learn about bandwidth monitoring with flows and packet sniffing with our network monitoring solution PRTG Network Monitor (https://www.paessler.com/prtg). If you're interested in additional methods for monitoring bandwidt…

758 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

21 Experts available now in Live!

Get 1:1 Help Now