2016-01-26 60 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應用程序。

相關問題