将字符串与进程名称进行比较

时间:2014-03-30 01:44:36

标签: c# visual-studio-2013

我想这样做...如果记事本在前台它打开计算器...如果另一个程序打开什么都没做...记事本是oepn manualy ...“开始,记事本”......我有这个代码“看”如果记事本是开放的...不知道如何继续D:我知道我必须使用

if (switch == 0)
{
if (SOMETHING == "Notepad")
{
   var switch = 1 //so it doesnt enters in a loop
   OPEN CALCULATOR //irrelevant, i may use another part of otrher code that is already working
   }
}

“switch”变量从代码的开头变为0,这样就可以了(希望)

[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
public static extern IntPtr GetForegroundWindow();

[DllImport("user32.dll", SetLastError = true)]
static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId);

Process GetActiveProcess()
{
    IntPtr hwnd = GetForegroundWindow();
    uint pid;
    GetWindowThreadProcessId(hwnd, out pid);
    Process p = Process.GetProcessById((int)pid);
    return p;
}

问题是我不知道在“SOMETHING”上使用其余的代码,以及在何处或如何使用If ...

1 个答案:

答案 0 :(得分:1)

你可以这样做:

Process[] notePadProcesses  = Process.GetProcessesByName("notepad.exe");
IntPtr activeWindowHandle = GetForegroundWindow();

if (notePadProcesses != null && notePadProcesses.Length > 0
    && notePadProcesses.Any(p=>p.MainWindowHandle == activeWindowHandle))
{
 // notepad is open in the foreground.
 switch = 1;
 // OPEN Calculator or whatever you need to.
}
else
{
 // notepad is either not open, or not open in the foreground.
}

基本上我们使用C#友好的Process类来查找所有打开的记事本进程。 然后找出它是否是一个活跃的进程并从那里开始。

请小心使用activewindow逻辑,因为很多时候,它们会导致竞争条件,当您确定某个进程处于活动状态并尝试执行某些操作时,它可能不再是一个活动进程。谨慎行事。