2013-10-24 22 views
7

我写了一个小的.NET控制台程序,将启动Windows 8模拟器。非常简单:Microsoft.Smartdevice.Connectivity和Windows Phone 8,启动本机应用程序,发送输入?

using Microsoft.SmartDevice.Connectivity; 
using Microsoft.SmartDevice.Connectivity.Interface; 
using Microsoft.SmartDevice.MultiTargeting.Connectivity; 

MultiTargetingConnectivity connectivity = new MultiTargetingConnectivity(CultureInfo.CurrentUICulture.LCID); 
var devices = connectivity.GetConnectableDevices(); 
ConnectableDevice connectableDevice = devices[2]; 
Console.WriteLine("Found Connectable Device \'" + connectableDevice.Name + "\' for Device id {" + connectableDevice.Id + "}."); 

很简单。但是,我现在想要做的是以编程方式与设备进行交互。我知道我可以通过使用iDevice.installApplication来启动自己的应用程序,但我真正想做的是运行模拟器(邮件应用程序)附带的内置应用程序。我可以使用SmartDevice.Connectivity库来发送触摸,或启动GetInstalledApplications()方法中未显示的“隐藏”应用程序吗?该API很稀少,似乎并不像许多开发人员正在使用它。

回答

1

我已经找到了比SmartDevice框架更好的框架。在C:\Program Files (x86)\Microsoft XDE\8.0文件夹内,您可以找到Microsoft.XDE DLL,它们有助于为Windows 8模拟器包装/皮肤提供动力,并且它们是托管库,可让您与模拟器进行交互。示例代码:

private static void BootViaXdeLibs() 
{ 
    var factory = new Microsoft.Xde.Wmi.XdeWmiFactory(); 
    Console.WriteLine("Polling for virtual machines"); 

    var virtualMachine = factory.GetAllXdeVirtualMachines(SettingsOptions.None)[2]; 
    Console.WriteLine("Found machine {0}", virtualMachine.Name); 

    if (virtualMachine.EnabledState != VirtualMachineEnabledState.Disabled) 
    { 
     Console.WriteLine("Virtual Machine {0} is already running. Shutting down. ", virtualMachine.Name); 
     virtualMachine.Stop(); 
     while (virtualMachine.EnabledState != VirtualMachineEnabledState.Disabled) 
     { 
      Thread.Sleep(1000); 
     } 
    } 

    Console.WriteLine("Starting {0}", virtualMachine.Name); 

    virtualMachine.Start(); 
    while (virtualMachine.EnabledState == VirtualMachineEnabledState.Starting) 
    { 
     Thread.Sleep(1000); 
    } 

    Console.WriteLine("Sleeping before image capture to give boot time"); 
    Thread.Sleep(30000); 

    //Click on the screen 
    virtualMachine.SendMouseEvent(new MouseEventArgs(MouseButtons.Left, 1, 295, 260, 0)); 
    Thread.Sleep(100); 
    virtualMachine.SendMouseEvent(new MouseEventArgs(MouseButtons.None, 0, 295, 260, 0)); 
    Thread.Sleep(1000); 

    Console.WriteLine("Saving screenshot"); 

    //Capture Screen 
    var res = virtualMachine.GetCurrentResolution(); 
    var image = virtualMachine.GetScreenShot(0, 0, res.Width, res.Height); 
    image.Save("C:\\image.png", ImageFormat.Png); 

    virtualMachine.Stop(); 
} 
相关问题