加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

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

发布时间:2020-12-14 02:21:06 所属栏目:Windows 来源:网络整理
导读:我的大问题: 我需要从同一个操作系统实例/机器上的 Windows 10桌面应用程序(或服务)发送信号到UWP XAML MVVM应用程序. 我在全局命名空间中使用了命名信号量,但这些在UWP上根本不起作用(出于安全原因,可能是设计).没有快乐. 我尝试过UWP套接字,只有当客户端
我的大问题:
我需要从同一个操作系统实例/机器上的 Windows 10桌面应用程序(或服务)发送信号到UWP XAML MVVM应用程序.

我在全局命名空间中使用了命名信号量,但这些在UWP上根本不起作用(出于安全原因,可能是设计).没有快乐.

我尝试过UWP套接字,只有当客户端在远程计算机上时才能使用UWP作为监听器.这也是一个安全设计决定吗?不知道.免除应用程序的环回限制没有帮助,因为这仅适用于UWP应用程序是发出请求的客户端.没有快乐.

好的,所以我只剩下向Windows上的特定窗口发送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应用程序是沙盒,因此您无法通过设计向Win32应用程序发送或接收消息等.

有一些可能不太令人满意的选项,例如通过本地套接字启用环回通信:https://stackoverflow.com/a/33263253/95190(这可能是你尝试过的 – 目前尚不清楚).

但是,如果您需要从本地安装的服务与Universal应用程序进行通信,则UWP应用程序可能不是当今最佳平台选择.

有一些方法可以启动应用程序并在启动时提供一些数据,但Win32服务不应启动交互式用户进程(因此,它也不是传递数据的好方法).

如果需要与Win32应用程序/服务进行通信,您可能需要考虑将应用程序构建为WPF应用程序.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读