public async void CreateTextCommand(string file_to_run)
{
StorageFolder localFolder =
Windows.Storage.ApplicationData.Current.LocalFolder;
var file = await localFolder.CreateFileAsync("proxyfile.txt", CreationCollisionOption.ReplaceExisting);
bb.Text = "Kinect已打开";
string command = string.Format("run={0},{1}", file_to_run, DateTime.Now.Ticks);
await FileIO.WriteTextAsync(file, command);
}
这个问题按照surface系统的架构是不可能直接实现的。因为我们熟知的Process类在应用商店应用中不存在,我们的电脑大多是在用X86架构(处理器),而windows RT是ARM架构的处理器,这就是process类被删去的原因。
因此,想要实现在Windows store App中调用exe文件,以前的方法行不通。
我的思路是曲线救国。
第一步,在sln中建立一个名为ProxyWpf的代理应用。这个应用与原本的应用完全分离,只负责调用exe。因为是wpf项目,所以可以使用prcess.start()调用exe文件。
如图所示,上面的项目就是windows8 app,而底下的是代理proxyWpf。
我们在Windows8 app中创建一个文本文件 ,并写入想要运行的exe。使用DateTime.Now.Ticks获取触发时的时间,并写入txt文件。每次点击触发,会得到不同的时间值。txt文件的内容如下:
proxyWpf是一个监视器,发现这个txt文件变化后就会执行exe文件。在这里,监视的功能由FileSystemWatcher实现。
static void ProcessCommand()以上代码的作用是读取txt文件的内容,获得运行的命林。
{
// pause for 100 millisecond for Windows to properly write the contents of the
// proxyfile.txt
System.Threading.Thread.Sleep(100);
string file_to_run = string.Empty;
string UID = string.Empty;
string filename = System.IO.Path.Combine(@"localPath", "proxyfile.txt");
if (!File.Exists(filename))
{
MessageBox.Show("proxyfile.txt is missing!");
}
using (StreamReader reader = new StreamReader(filename))
{
string data = reader.ReadToEnd();
string[] cmd2 = data.Split('=')[1].Split(',');
file_to_run = cmd2[0];
UID = cmd2[1];
}
if (!running_apps.Contains(file_to_run + UID))
{
RunOnce(file_to_run, UID);
}
else
{
Debug.WriteLine(file_to_run + " is already running");
}
}
static void RunOnce(string fullpath, string UID)为了防止多次调用,需要进行判断。
{
ProcessStartInfo psi = new ProcessStartInfo()
{
FileName = fullpath,
UseShellExecute = true
};
Process.Start(psi);
running_apps.Add(fullpath + UID);
}
综上,一旦监测到proxyfile.txt发生变化,
watcher.Changed += new FileSystemEventHandler(OnChanged);Onchanged事件被触发,启动.exe文件。
Tips:
1、可在解决方案资源管理器的属性中将两个项目均设为启动项,如下图所示:
2、Windows8 app中的文件路径非常奇怪,建议使用Windows.Storage.ApplicationData.Current.LocalFolder这个目录,否则会出现权限错误。
3、此类实验危险性较高,尝试的时候随时保存重要文件,我在刚开始尝试的时候半个小时重启三次,因为毕竟是多个进程,且涉及调用,处理不好会导致打开好多个文件。