2016-05-12 52 views
3

我使用的程序运行通过C#宏的执行:WPF C# - 连续执行任务,并允许其他任务

任务1:

EXCELApplicationObj.GetType().InvokeMember("Run", 
     System.Reflection.BindingFlags.Default | 
     System.Reflection.BindingFlags.InvokeMethod, 
     null, EXCELApplicationObj, oRunArgs); 

不过,虽然这个功能是怎么回事我想它的TITLENAME检查窗口的发生,并为我用这个:

任务2:

Process[] processlist = Process.GetProcesses(); 
foreach (Process process in processlist) 
{ 
    if (!String.IsNullOrEmpty(process.MainWindowTitle)) 
    { 
     process.ProcessName, process.Id, process.MainWindowTitle); 
     if (process.MainWindowTitle == "Untitled - Notepad") { 
      process.Kill(); 
     } 
    } 
} 

但问题是我想在这个过程中运行这个并行,以便我想执行宏,并且每当出现一个名为“无标题 - 记事本”的新窗口时,我想关闭它。 任何stackoverflowers可以给我任何指导。 线程听说,但我不知道很多有关线程..

更新: 寻找的是什么IAM:

时间可持续执行任务2,并允许任务1的执行。

回答

2

下面是一个例子,而运行一些代码并行自动关闭窗口:

static void Main() { 

    // execute AsyncCloseTopWindow in parallel to close a window named "Untitled - Notepad" 
    var thread = new Thread(AsyncCloseTopWindow); 
    thread.IsBackground = true;   
    thread.Start("Untitled - Notepad"); 

    // execute the macro while AsyncCloseTopWindow is running 
    //... 

    // exit AsyncCloseTopWindow 
    thread.Interrupt(); 
} 

private static void AsyncCloseTopWindow(object windowTitle) { 
    try { 
     while (true) { 

      // close any window matching the title 
      IntPtr hwnd = FindWindow(IntPtr.Zero, (string)windowTitle); 
      if (!hwnd.Equals(IntPtr.Zero)) { 
       SendMessage(hwnd, WM_CLOSE, IntPtr.Zero, IntPtr.Zero); 
      } 

      // wait 30ms 
      Thread.Sleep(30); 
     } 
    } catch (ThreadInterruptedException) { } 
} 

private const UInt32 WM_CLOSE = 0x0010; 

[DllImport("user32.dll", CharSet = CharSet.Unicode)] 
private static extern IntPtr FindWindow(IntPtr lpClassName, string lpWindowName); 

[DllImport("user32.dll", SetLastError = true)] 
private static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam); 
+0

Hi @Florent B.,任何想法如何在wpf中使用DllImport,它显示错误。 –

+0

什么是错误? –

+0

错误4无法找到类型或名称空间名称'DllImport'(您是否缺少使用指令或程序集引用? –

1

您可以使用单独的线程来运行代码,以查找窗口并关闭它们。在对象中需要一个专用字段stopClosingWindows来告诉并行线程何时终止。

private bool stopClosingWindows;

你需要一个单独的方法来执行寻找窗户和在一个循环结束他们的行动:

private void ParallelCloseWindows() 
{ 
    while (!stopClosingWindows) 
    { 
     // Only look every 200ms so we don't waste processor ressources 
     Thread.Sleep(200); 

     // perform the task 
     Process[] processlist = Process.GetProcesses(); 
     foreach (Process process in processlist) 
     { 
      if (!String.IsNullOrEmpty(process.MainWindowTitle)) 
      { 
       if (process.MainWindowTitle == "Untitled - Notepad") 
       { 
        process.Kill(); 
       } 
      } 
     } 
    } 
} 

现在你开始你的实际代码执行宏之前,设置stopClosingWindows为false,并开始并行线。并且在您的实际代码执行宏之后,将stopClosingWindows设置为false以指示它可以停止并终止的线程。

使用try/finally,即使在执行宏时出现异常,并行线程也会停止。

stopClosingWindows = false; 
try 
{ 
    // Create a new thread that should execute the method ParallelCloseWindows in parallel 
    var thread = new Thread(ParallelCloseWindows); 

    // set isBackground to true so that this thread would not prevent your application from closing when 
    // we forget to terminate it 
    thread.IsBackground = true; 

    // and start the new thread 
    thread.Start(); 

    EXCELApplicationObj.GetType().InvokeMember("Run", 
      System.Reflection.BindingFlags.Default 
      | System.Reflection.BindingFlags.InvokeMethod, 
      null, EXCELApplicationObj, oRunArgs); 
} 
finally 
{ 
    stopClosingWindows = true; 
} 
+0

谢谢@NineBerry ......但是当我试图IAM在宏观invoaction线得到一个例外......任何理念! –

+0

'mscorlib.dll中发生类型'System.Reflection.TargetInvocationException'的未处理异常其他信息:异常已被调用的目标抛出。' –

+0

我想说宏发生错误时宏尝试用它创建的记事本窗口做些什么。似乎你不能简单地关闭记事本实例。宏完成执行后可能关闭它们全部? – NineBerry

1

我认为你希望在循环中运行“kill all untitled notepad processes”。考虑到这一点,试试这个...

public void killNotepad() 
    { 
     Process[] processlist = Process.GetProcesses(); 
     foreach (Process process in processlist) 
     { 
      if (!String.IsNullOrEmpty(process.MainWindowTitle)) 
      { 
       //process.ProcessName, process.Id, process.MainWindowTitle); 
       if (process.MainWindowTitle == "Untitled - Notepad") 
       { 
        process.Kill(); 
       } 
      } 
     } 
    } 

    public void killNotepadRunAsync() 
    { 
     System.Threading.Thread th = new System.Threading.Thread(() => 
     { 
      while (true) 
      { 
       killNotepad(); 
       System.Threading.Thread.Sleep(300); 
      } 
     }); 
     th.SetApartmentState(System.Threading.ApartmentState.STA); 
     th.Start(); 
    } 

的“killNotepad()”方法在由“killNotepadRunAsync()”方法执行的线程中运行多次,所以调用killNotepadRunAsync()方法,在那里你需要它。

在进行下一个Process.getProcesses()调用之前,System.Threading.Thread.Sleep(300)会使线程休眠300毫秒,这会让您的CPU有一些时间喘口气。

嗯,我评论了第e行,因为我不确定你想用它做什么。这也是一个语法错误。

玩得开心!

+0

我的宏调用会抛出一个异常,它说:'System.Reflection.TargetInvocationException类型的未处理异常'发生在mscorlib.dll 附加信息:异常已被调用的目标抛出。' –