在UWP XAML MVVM应用程序中如何接收最简单的Windows消息?

6
我的大问题是: 我需要从Windows 10桌面应用程序(或服务)向同一操作系统实例/机器上的UWP XAML MVVM应用程序发送信号。
我曾经使用全局命名信号量,但这些在UWP上根本不起作用(出于设计原因,可能是出于安全考虑)。没有收获。
我尝试了UWP套接字,这仅在客户端位于远程机器上时才与UWP作为监听器一起工作。这也是一个安全设计决策吗?我不知道。豁免应用程序的环回限制并没有帮助,因为这仅适用于UWP应用程序是发出请求的客户端的情况。没有收获。
好吧,所以我只能向操作系统上的特定窗口发送Windows消息......
我的测试应用程序是GitHub上的UWP AdventureWorks示例。我如何让它处理来自不同进程的Windows消息?我被卡住了。
以下是我的测试客户端代码。
问题: 我如何在AdventureWorks中处理此消息?重要的是尽量减少代码更改,但目前我被卡住了,不知道该怎么做。(似乎这是一个紧密保持的秘密......)
请帮忙!请提供示例代码。
class Program
{
    [DllImport("user32.dll")]
    public static extern IntPtr FindWindow(string lpClassName, String lpWindowName);

    [DllImport("user32.dll")]
    public static extern int SendMessage(IntPtr hWnd, uint wMsg, IntPtr wParam, IntPtr lParam);

    [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
    static extern uint RegisterWindowMessage(string lpString);

    [DllImport("kernel32.dll")]
    static extern uint GetLastError();

    static void Main(string[] args)
    {
        const string lpClassName = "ApplicationFrameWindow";
        const string lpWindowName = "AdventureWorks.Shopper";
        IntPtr hwnd = FindWindow(lpClassName, lpWindowName);

        uint messageId = RegisterWindowMessage("MetaAutomationMessage");


        int sendMessageResult = SendMessage(hwnd, messageId, IntPtr.Zero, IntPtr.Zero);
        Console.WriteLine(string.Format("Message result is '{0}', ", sendMessageResult));

        uint lastError = GetLastError();
        Console.WriteLine(string.Format("GetLastError result is '{0}', ", lastError));
    }
}

关于“尝试使用UWP套接字,如果客户端在远程机器上,则仅作为侦听器与UWP一起工作。这也是安全设计决策吗?我不知道。”,您是否考虑过这可能无法正常工作是因为包清单中未启用“私有网络(客户端和服务器)”功能? - Saxar
如果您可以控制Win 10应用程序以及UWP应用程序,那么您可以实现SignalR来向其他应用程序广播/信号。 - Richard Bailey
2个回答

3

2
UWP应用程序是沙盒化的,因此您无法通过设计与Win32应用程序发送或接收消息等。有一些可能不太理想的选项,例如启用本地套接字上的环回通信:https://dev59.com/y1wX5IYBdhLWcg3w4S3R#33263253(这也许是您尝试过的方法——不太清楚)。然而,如果您需要从本地安装的服务通信到您的通用应用程序,则UWP应用程序可能不是最佳平台选择。有一些启动应用程序并在启动时提供一些数据的方法,但Win32服务不应该启动交互式用户进程(因此,它也不是传递数据的好方法)。如果需要与Win32应用程序/服务通信,您可能需要考虑将应用程序构建为WPF应用程序。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接