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

我的大问题:我需要从Windows 10桌面应用程序(或服务)发送信号到同一OS实例/机器上的 UWP XAML MVVM应用程序

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

我尝试了UWP套接字, 只有当客户端在远程计算机上时,它才能与UWP一起作为监听器。 这也是一个安全devise的决定吗? 不知道。 豁免应用程序从回送限制没有帮助,因为这只适用于如果UWP应用程序是提出请求的客户端。 没有快乐。

好的,所以我留下了一个Windows消息发送到操作系统上的特定窗口…

我的testing应用程序是GitHub上UWP的AdventureWorks示例。 我如何得到这个来处理从不同进程发送的Windows消息? 我很难过

以下是我的testing客户端代码。

问题:如何在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 (这可能是你试过的 – 不清楚)。

然而,如果您需要从本地安装的服务与您的通用应用程序进行通信,则UWP应用程序今天可能不是最好的平台选择。

有一些启动应用程序和提供一些数据作为启动的一部分的方法,但Win32服务不应该启动交互式用户进程(所以,这也不是传递数据的好方法)。

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

Windows 10 UWP应用程序服务通信可以是在UWP应用程序之间发送键值集合的选项之一。

参考: https : //msdn.microsoft.com/en-us/windows/uwp/launch-resume/how-to-create-and-consume-an-app-service