c# - IApplicationActivationManager::ActivateApplication 在 C# 中?

标签 c# com windows-8

我正在为 Metro 应用程序进行自动化测试,我发现代码可以完成我需要的很多工作,但它是用 C++ 编写的:http://blogs.msdn.com/b/windowsappdev/archive/2012/09/04/automating-the-testing-of-windows-8-apps.aspx

我的问题是,因为我不懂 C++,所以如何在 C# 中使用 IApplicationActivationManager::ActivateApplication? 该方法的详细信息可在此处找到:http://msdn.microsoft.com/en-us/library/windows/desktop/hh706903(v=vs.85).aspx

这是我从 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; }

有什么想法吗?

谢谢

最佳答案

试试下面适合我的代码片段。

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: Windows Registry Editor

关于c# - IApplicationActivationManager::ActivateApplication 在 C# 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12925748/

相关文章:

windows-7 - 在 Windows 7 上注册 vb6 exe 文件时出现错误(意外错误;正在退出)

c++ - 使用 VC++ 以编程方式从 Excel 复制单元格

c# - 终止 TabletKeyboard(TabTip.exe) 应用程序的进程后,在 wpf 中不会恢复到其原始大小

c# - 如何使用 log4net 使用 Threadpool 线程记录正确的上下文?

c# - 正则表达式与 C# 中的预期不匹配

c# - .NET 4.5 的奇怪文本框问题 - 不允许 '.'

c# - 以任何形式(Json、xml 等)序列化 Dictionary<String、Dictionary<String、String>>

c# - 如何将形状的属性绑定(bind)到业务模型的属性

.net - 如何从网络驱动器获取在 Delphi 下运行的 .NET 程序集?

html - Windows 8 邮件应用程序未显示订阅/取消订阅超链接?