IApplicationActivationManager :: ActivateApplication在C#中? [英] IApplicationActivationManager::ActivateApplication in C#?
问题描述
我工作的自动化测试的应用程序地铁,我发现code做了很多我需要什么,但它在C ++:<一href=\"http://blogs.msdn.com/b/windowsappdev/archive/2012/09/04/automating-the-testing-of-windows-8-apps.aspx\">http://blogs.msdn.com/b/windowsappdev/archive/2012/09/04/automating-the-testing-of-windows-8-apps.aspx
I'm working on automated testing for metro apps and I found code to do a lot of what I need, but it's in C++: http://blogs.msdn.com/b/windowsappdev/archive/2012/09/04/automating-the-testing-of-windows-8-apps.aspx
我的问题是,我怎么使用IApplicationActivationManager :: ActivateApplication在C#中,因为我不知道C ++?
该方法的细节在这里找到:<一href=\"http://msdn.microsoft.com/en-us/library/windows/desktop/hh706903(v=vs.85).aspx\">http://msdn.microsoft.com/en-us/library/windows/desktop/hh706903(v=vs.85).aspx
My question is, how do I use IApplicationActivationManager::ActivateApplication in C# because I don't know C++? Details for the method are found here: http://msdn.microsoft.com/en-us/library/windows/desktop/hh706903(v=vs.85).aspx
这里的code,我从Shobjidl.idl拉:
Here's the code I pulled from Shobjidl.idl:
cpp_quote("DEFINE_ENUM_FLAG_OPERATORS(ACTIVATEOPTIONS)")
// IApplicationActivationManger is used to activate an immersive application identified by its Application User Model Id.
//
// Developers who are interested in using the Application Activation Manager do not need to implement the following
// interface. An implementation is provided through the CoCreatable Object with CLSID_ApplicationActivationManager.
[
object,
uuid(2e941141-7f97-4756-ba1d-9decde894a3d),
pointer_default(unique)
]
interface IApplicationActivationManager : IUnknown
{
// 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.
HRESULT ActivateApplication(
[in] LPCWSTR appUserModelId,
[in, unique] LPCWSTR arguments,
[in] ACTIVATEOPTIONS options,
[out] DWORD *processId);
HRESULT ActivateForFile(
[in] LPCWSTR appUserModelId,
[in] IShellItemArray *itemArray,
[in, unique] LPCWSTR verb,
[out] DWORD *processId);
HRESULT ActivateForProtocol(
[in] LPCWSTR appUserModelId,
[in] IShellItemArray *itemArray,
[out] DWORD *processId);
}
// CLSID_ApplicationActivationManager
[ uuid(45BA127D-10A8-46EA-8AB7-56EA9078943C) ] coclass ApplicationActivationManager { interface IApplicationActivationManager; }
任何想法?
感谢
推荐答案
试着用下面的code段这对我的作品。
Try with the below code snippet which works for me.
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] IntPtr /*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] IntPtr /*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);
}
class Program
{
static void Main(string[] args)
{
ApplicationActivationManager appActiveManager = new ApplicationActivationManager();//Class not registered
uint pid;
appActiveManager.ActivateApplication("2c123c17-8b21-4eb8-8b7f-fdc35c8b7718_n2533ggrncqjt!App", null, ActivateOptions.None, out pid);
Console.WriteLine();
Console.ReadLine();
}
}
希望你可能已经知道如何让应用程序名称来激活。然而,想分享这些信息在这里为其他谁可能搜索相同。我们可以从下面的注册表位置获得AppUserModelID:
这篇关于IApplicationActivationManager :: ActivateApplication在C#中?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!