Comment recevoir le message Windows le plus simple sur l’application UWP XAML MVVM?

Mon gros problème: je dois envoyer un signal depuis une application de bureau Windows 10 (ou un service, en réalité) vers une application UWP XAML MVVM sur la même instance / machine du système d’exploitation.

J’utilisais des sémaphores nommés dans l’espace de noms global, mais ceux-ci ne fonctionnent pas du tout sur UWP (pour des raisons de sécurité par exemple). Pas de joie.

J’ai essayé les sockets UWP, et cela fonctionne avec le UWP en tant qu’écouteur uniquement si le client est sur une machine distante. Est-ce une décision de conception de sécurité également? Aucune idée. L’exemption de l’application de la ressortingction de bouclage n’aide pas, car cela ne s’applique que si l’application UWP est le client effectuant la demande. Pas de joie.

OK, il me rest donc à envoyer un message Windows à la fenêtre spécifique du système d’exploitation …

Mon application de test est l’exemple AdventureWorks pour UWP sur GitHub. Comment puis-je obtenir ceci pour gérer un message Windows envoyé à partir d’un processus différent? Je suis déconcerté.

Voici mon code client de test.

QUESTION: Comment gérer ce message dans AdventureWorks? Il est important de limiter au maximum les changements de code, mais je suis bloqué et je n’ai aucune idée de la suite à donner. (Il semble que ce soit un secret très serré …)

S’il vous plaît aider! Exemple de code s’il vous plaît.

class Program { [DllImport("user32.dll")] public static extern IntPtr FindWindow(ssortingng lpClassName, Ssortingng 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(ssortingng lpSsortingng); [DllImport("kernel32.dll")] static extern uint GetLastError(); static void Main(ssortingng[] args) { const ssortingng lpClassName = "ApplicationFrameWindow"; const ssortingng lpWindowName = "AdventureWorks.Shopper"; IntPtr hwnd = FindWindow(lpClassName, lpWindowName); uint messageId = RegisterWindowMessage("MetaAutomationMessage"); int sendMessageResult = SendMessage(hwnd, messageId, IntPtr.Zero, IntPtr.Zero); Console.WriteLine(ssortingng.Format("Message result is '{0}', ", sendMessageResult)); uint lastError = GetLastError(); Console.WriteLine(ssortingng.Format("GetLastError result is '{0}', ", lastError)); } } 

L’application UWP est en mode bac à sable, vous ne pouvez donc pas envoyer ou recevoir de messages, etc., par conception, vers une application Win32.

Il existe des options potentiellement moins souhaitables, comme l’activation des communications en boucle sur une socket locale: https://stackoverflow.com/a/33263253/95190 (ce qui est peut-être ce que vous avez essayé – ce n’est pas clair).

Toutefois, une application UWP peut ne pas être le meilleur choix de plate-forme si vous devez communiquer depuis un service installé localement vers votre application Universal.

Il existe plusieurs moyens de lancer une application et de fournir des données dans le cadre du lancement, mais un service Win32 ne doit pas lancer de processus utilisateur interactif (ce ne serait donc pas un bon moyen de transmettre des données).

Vous souhaiterez peut-être envisager de créer votre application en tant qu’application WPF si la communication avec une application / service Win32 est nécessaire.

La communication du service App Windows 10 UWP peut être l’une des options pour envoyer un ensemble de valeurs-clés entre les applications UWP.

Référence: https://msdn.microsoft.com/en-us/windows/uwp/launch-resume/how-to-create-and-consume-an-app-service