我正在使用以下过程通过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();
}
}
}
但问题是我想在这个过程中运行这个并行,以便我想执行宏,并且每当新窗口出现时命名为" Untitled - Notepad"我想关闭它。 任何stackoverflowers可以给我任何指导。 听说过线程但我对线程知之甚少..
更新: 我在寻找什么:
连续执行Task2并允许执行Task1。
答案 0 :(得分: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);
答案 1 :(得分:1)
您可以使用单独的线程来运行查找窗口的代码并关闭它们。您需要在对象中使用私有字段ORDER BY ROWNUM
来告诉并行线程何时终止。
private bool stopClosingWindows;
您需要一个单独的方法来执行查找窗口并在循环中关闭它们的操作:
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();
}
}
}
}
}
设置为false并启动并行线程。在您执行宏的实际代码之后,将stopClosingWindows
设置为false以表示线程可以停止并终止。
使用try / finally,以便即使在执行宏时出现异常,并行线程也会停止。
stopClosingWindows
答案 2 :(得分: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()方法。
System.Threading.Thread.Sleep(300)使线程在进行下一个Process.getProcesses()调用之前休眠300毫秒,这样可以让你的cpu有一些时间来屏住呼吸。
嗯,我评论了第八行,因为我不确定你想用它做什么。这也是一个语法错误。玩线程好玩!