2016-05-12 76 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 附加信息:異常已被調用的目標拋出。' –