SendMessage в консольное приложение .NET

Я экспериментировал с отправкой сообщений из двух приложений .NET Windows Forms с помощью WM_COPYDATA, и это прекрасно работает.

Я хотел бы знать, можно ли это сделать с помощью консольных приложений.

После того, как все функции SendMessage принимают дескриптор окна, как я могу получить дескриптор окна консольного приложения?

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

Также мне нужно настроить какой-то цикл сообщений в консольном приложении, чтобы иметь возможность получать сообщения?


person G-Man    schedule 04.03.2010    source источник
comment
@GX: в первой ссылке в моем ответе есть обновленная версия кода, предназначенная для служб и консолей Windows ...   -  person t0mm13b    schedule 04.03.2010


Ответы (2)


Наиболее распространенными методами IPC (помимо WM_COPYDATA) являются отображаемые в память файлы и именованные каналы. . Я предлагаю вам проверить последний.

В MSDN есть пример связи по именованному каналу. В частности, вам нужно использовать классы NamedPipeServerStream и NamedPipeClientStream, которые ведут себя в значительной степени как обычные сетевые потоки после их создания.

Приятно то, что он также работает по сети, хотя вы, очевидно, можете использовать его и на одной машине.

Настройка фактического цикла сообщений Windows в консольном приложении, мягко говоря, сложна. Если вам действительно нужно это сделать, вот довольно объемная статья на эту тему . Я бы настоятельно рекомендовал вместо этого использовать именованные каналы, если все, что вы хотите сделать, это передать данные; если вам на самом деле не нужно обрабатывать стандартные сообщения Windows, то это не стоит затраченных усилий.

person Aaronaught    schedule 04.03.2010
comment
Да, я слышал о именованных каналах, но никогда не пытался их реализовать. Спасибо за хорошие ссылки на ресурсы - person G-Man; 04.03.2010

@tommieb75: XDMessaging на самом деле является моей библиотекой :) WM_COPYDATA не работает для консольных приложений, так как у них нет перекачки сообщений. Однако библиотека включает реализацию IPC на основе IOStream, которая работает с консольными приложениями и службами. http://thecodeking.github.com/XDMessaging.Net/

person TheCodeKing    schedule 25.03.2010
comment
Это не дает ответа на вопрос. Чтобы подвергнуть критике или запросить разъяснения у автора, оставьте комментарий под его публикацией. - person Philipp Wendler; 19.04.2015
comment
У меня не было достаточно представителей во время публикации, чтобы добавить комментарий. - person TheCodeKing; 19.04.2015