我有一个要求,如果用户从他/她的硬盘驱动器打开任何办公文档,它应该打开一个exe(win表单应用程序)作为模式窗口来捕获有关该文档的详细信息。
为此,我开发了一个在客户机下运行的控制台应用程序,用于监控是否有任何office文档文件正在打开。请找到以下代码
static void Main(string[] args)
{
var UIAEventHandler = new AutomationEventHandler(OnUIAEvent);
Automation.AddAutomationEventHandler(WindowPattern.WindowOpenedEvent,
AutomationElement.RootElement,
TreeScope.Children, UIAEventHandler);
Console.ReadLine();
Automation.RemoveAllEventHandlers();
}
public static void OnUIAEvent(object src, AutomationEventArgs args)
{
AutomationElement element;
try
{
element = src as AutomationElement;
}
catch
{
return;
}
string name = "";
if (element == null)
name = "null";
else
{
name = element.GetCurrentPropertyValue(
AutomationElement.NameProperty) as string;
}
if (name.Length == 0) name = "< NoName >";
string guid = Guid.NewGuid().ToString("N");
string str = string.Format("{0} : {1}", name, args.EventId.Id);
if ((element.Current.ClassName.Equals("XLMAIN", StringComparison.InvariantCultureIgnoreCase) == true && name.Contains(".xlsx")) || (element.Current.ClassName.Equals("OpusApp", StringComparison.InvariantCultureIgnoreCase) == true && name.Contains(".docx")))
{
Process.Start(@"E:\experiment\TestingWindowsService\UserInfomation\bin\Debug\UserInfomation.exe", element.Current.Name);
//Automation.AddAutomationEventHandler(
// WindowPattern.WindowClosedEvent,
// element, TreeScope.Element, (s, e) => UIAEventHandler1(s, e, guid, name));
Console.WriteLine(guid + " : " + name);
// Environment.Exit(1234);
}
}
如果您在OnUIAEvent
事件处理程序中看到我正在使用Process.Start
打开一个exe.It正在按预期工作。但我希望exe应该打开作为打开文档的模态。下面的代码是exe的表单加载。
private void Form1_Load(object sender, EventArgs e)
{
this.TopMost = true;
this.CenterToScreen();
}
是否可以打开Windows应用程序以打开文档的模态打开?
答案 0 :(得分:0)
除非外部应用程序的编码考虑到您的要求,否则将很困难。 如果您可以访问代码(您似乎拥有),则可以在控制台应用程序中包含该表单(请参阅此处how to run a winform from console application?)。
最简单的选择是启动Windows窗体项目,然后更改 输出类型到控制台应用程序。或者,只需添加一个 引用System.Windows.Forms.dll,并开始编码:
using System.Windows.Forms; [STAThread] static void Main() { Application.EnableVisualStyles(); Application.Run(new Form()); // or whatever }
重要的一点是Main()方法的[STAThread],是完全COM支持所必需的。
您可以覆盖创建者,添加与文档匹配的参数,或者记录/监控所需的任何内容。