从硬盘驱动器

时间:2016-12-17 05:18:27

标签: c# windows winforms automationelement

我有一个要求,如果用户从他/她的硬盘驱动器打开任何办公文档,它应该打开一个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应用程序以打开文档的模态打开?

1 个答案:

答案 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支持所必需的。

您可以覆盖创建者,添加与文档匹配的参数,或者记录/监控所需的任何内容。