diff --git a/UWPHook/App.xaml.cs b/UWPHook/App.xaml.cs index 2d70dfd..a15aa95 100644 --- a/UWPHook/App.xaml.cs +++ b/UWPHook/App.xaml.cs @@ -7,5 +7,6 @@ namespace UWPHook /// public partial class App : Application { + } } diff --git a/UWPHook/AppManager.cs b/UWPHook/AppManager.cs new file mode 100644 index 0000000..6bdb23b --- /dev/null +++ b/UWPHook/AppManager.cs @@ -0,0 +1,91 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using System.Text; +using System.Threading.Tasks; + +namespace UWPHook +{ + class AppManager + { + private int id; + + public void LaunchUWPApp(string uri) + { + var mgr = new ApplicationActivationManager(); + uint processId; + mgr.ActivateApplication(uri, null, ActivateOptions.None, out processId); + + id = (int)processId; + } + + public Boolean IsRunning() + { + if (id == 0) + { + return false; + } + try + { + Process.GetProcessById(id); + } + catch (Exception) + { + return false; + } + + return true; + } + } + + public enum ActivateOptions + { + None = 0x00000000, // No flags set + DesignMode = 0x00000001, // The application is being activated for design mode, and thus will not be able to + // to create an immersive window. Window creation must be done by design tools which + // load the necessary components by communicating with a designer-specified service on + // the site chain established on the activation manager. The splash screen normally + // shown when an application is activated will also not appear. Most activations + // will not use this flag. + NoErrorUI = 0x00000002, // Do not show an error dialog if the app fails to activate. + NoSplashScreen = 0x00000004, // Do not show the splash screen when activating the app. + } + + [ComImport, Guid("2e941141-7f97-4756-ba1d-9decde894a3d"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + interface IApplicationActivationManager + { + // Activates the specified immersive application for the "Launch" contract, passing the provided arguments + // string into the application. Callers can obtain the process Id of the application instance fulfilling this contract. + IntPtr ActivateApplication([In] String appUserModelId, [In] String arguments, [In] ActivateOptions options, [Out] out UInt32 processId); + IntPtr ActivateForFile([In] String appUserModelId, [In] [MarshalAs(UnmanagedType.Interface, IidParameterIndex = 2)] /*IShellItemArray* */ IShellItemArray itemArray, [In] String verb, [Out] out UInt32 processId); + IntPtr ActivateForProtocol([In] String appUserModelId, [In] IntPtr /* IShellItemArray* */itemArray, [Out] out UInt32 processId); + } + + [ComImport, Guid("45BA127D-10A8-46EA-8AB7-56EA9078943C")]//Application Activation Manager + class ApplicationActivationManager : IApplicationActivationManager + { + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)/*, PreserveSig*/] + public extern IntPtr ActivateApplication([In] String appUserModelId, [In] String arguments, [In] ActivateOptions options, [Out] out UInt32 processId); + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public extern IntPtr ActivateForFile([In] String appUserModelId, [In] [MarshalAs(UnmanagedType.Interface, IidParameterIndex = 2)] /*IShellItemArray* */ IShellItemArray itemArray, [In] String verb, [Out] out UInt32 processId); + [MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)] + public extern IntPtr ActivateForProtocol([In] String appUserModelId, [In] IntPtr /* IShellItemArray* */itemArray, [Out] out UInt32 processId); + } + + [ComImport] + [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + [Guid("43826d1e-e718-42ee-bc55-a1e261c37bfe")] + interface IShellItem + { + } + + [ComImport] + [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] + [Guid("b63ea76d-1f85-456f-a19c-48159efa858b")] + interface IShellItemArray + { + } +} diff --git a/UWPHook/MainWindow.xaml b/UWPHook/MainWindow.xaml index 7c97ea1..6679be8 100644 --- a/UWPHook/MainWindow.xaml +++ b/UWPHook/MainWindow.xaml @@ -5,11 +5,11 @@ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:UWPHook" mc:Ignorable="d" - Title="UWPHook" Height="350" Width="525" Loaded="Window_Loaded" Icon="1_cJz_icon.ico"> + Title="UWPHook" Height="600" Width="800" Loaded="Window_Loaded" Icon="1_cJz_icon.ico"> - - + + @@ -20,7 +20,11 @@ - + + + + + @@ -32,18 +36,17 @@ - + - - - + + -