SendMessage to .NET console application

2019-01-29 03:58发布

问题:

I have been experimenting with sending messages from two .NET Windows Forms applications using WM_COPYDATA, and it works great.

I would like to know if that can be accomplished with console applications.

After all the SendMessage function takes in a window handle, how can I get the window handle of a console application?

[DllImport("User32.dll")]
public static extern Int32 SendMessage(int hWnd, int Msg, int wParam, [MarshalAs(UnmanagedType.LPStr)] string lParam);

Also do I need to set up some kind of message loop in the console application to be able to receive messages?

回答1:

The most common IPC methods (aside from WM_COPYDATA) are memory-mapped files and named pipes. I suggest you check out the latter.

MSDN has an example of named-pipe communication. Specifically the classes you need to use are NamedPipeServerStream and NamedPipeClientStream, which behave largely like ordinary network streams once they're created.

The nice thing is that it also works over a network, although you can obviously use it on a single machine as well.

Setting up an actual Windows message loop in a console application is complicated, to say the least. If you really need to do it, here's a rather long-winded article on the subject. I'd strongly recommend using named pipes instead if all you want to do is transfer data; if you don't actually need to handle standard Windows messages then this isn't going to be worth the effort.



回答2:

@tommieb75: XDMessaging is actually my library :) WM_COPYDATA doesn't work for console applications as they don't have a message pump. The library does however include a IOStream based IPC implementation that works for console apps and services. http://thecodeking.github.com/XDMessaging.Net/



回答3:

Here are the articles on CodeProject that makes use of WM_COPYDATA via a simple library, and here is another article that simply explains how it is implemented...