2016-01-26 59 views
5

我的大图片问题: 我需要从Windows 10桌面应用程序(或真正的服务)向同一OS实例/机器上的UWP XAML MVVM应用程序发送信号。如何在UWP XAML MVVM应用程序上接收最简单的Windows消息?

我在全局命名空间中使用了命名信号量,但这些在UWP上根本无法工作(出于安全原因,也许是设计)。没有快乐。

我试过UWP插座,并与UWP这个工程为收听只有当客户端是在远程机器上。这也是一个安全设计决定吗?不知道。从回送限制中豁免应用程序不会有帮助,因为只有在UWP应用程序是发出请求的客户端时才适用。没有快乐。

OK,所以我留下的OS上发送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)); 
    } 
} 
+0

在问候“?试过UWP插座,这一点也适用与UWP因为只有当客户端是在远程计算机上收听这是一个安全的设计决策,太不知道” ,您是否认为这可能不起作用,因为Package Manifest中没有启用“Private Networks(Client&Server)”功能? – Saxar

+0

我已经制定了胜利10应用程序以及uwp应用程序,您可以实施信号器广播/信号到其他应用程序。 –

回答

1

的UWP应用程序是沙箱,所以你不能设计发送或接收邮件等为Win32应用程序。

有些可能不太理想的选项,例如通过本地套接字启用环回通信:https://stackoverflow.com/a/33263253/95190(这可能是您尝试的 - 不清楚)。

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

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

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

相关问题