C# Windows 控制台应用程序中的消息?

C# Windows Messages in Console Application?

我需要使用 IPC 来接收来自另一个进程的消息。目前我正在使用 WPF 应用程序通过 WindowsMessages 接收消息,但我想知道该通信是否可以在 ConsoleApp 中运行?乍一看,我注意到 HwndSource 在 ConsoleApp 中找不到,所以问题是是否有办法在 ConsoleApp 中接收 WindowsMessages (首选方式),或者是否更容易创建一个改为使用 WPF 应用程序?

SendMessagePostThreadMessage API 仅在接收应用程序中存在活动消息循环时才有效运行。

如果您想与同一台机器上的控制台应用程序通信,您可以使用命名管道。 documentation 中有一个示例,应该会有帮助。

您可以使用一种绕行方法(同意,这不是最好和最干净的方法,但对我有用)。 添加对 System.Windows.Forms 的引用并创建一个从 Form 派生的 class,如下所示:

public class ConsoleReceiver : Form
{
    public ConsoleReceiver()
    {
        SetFormProperties();
    }

    private void SetFormProperties()
    {
        Text = "YourWindowName";
        Width = 0;
        Height = 0;
        ShowIcon = false;
        ShowInTaskbar = false;
        Opacity = 0.0;
        Visible = false;
        ControlBox = false;
        MaximizeBox = false;
        MinimizeBox = false;
        FormBorderStyle = System.Windows.Forms.FormBorderStyle.None;
    }

    protected override void WndProc(ref Message m)
    {
        //Wait for your message here
        Console.WriteLine($"Window message received {m.Msg} {m.LParam} {m.WParam}");
        base.WndProc(ref m);
    }
}

以上代码将创建一个隐形表单 window,您可以通过名称找到它并向您发送 window 消息。

在控制台应用程序的 Main 方法中创建消息循环并初始化表单:

static void Main(string[] args)
    {
        Application.Run(new ConsoleReceiver());
    }

最后,在您的发件人应用程序中按名称找到 window,一旦找到,您就可以发送 window 消息。

声明方法:

[DllImport("user32.dll")]
    public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

并按如下方式使用:

FindWindow(null, "YourWindowName");