如何在C#中获取活动进程名称?

时间:2011-07-04 09:12:45

标签: c#

如何在C#中获取活动进程名称?

我知道我必须使用这段代码:

[DllImport("user32.dll")]
private static extern IntPtr GetForegroundWindow();

但我不知道如何使用它。

5 个答案:

答案 0 :(得分:20)

正如this answer中所述,您必须使用GetWindowThreadProcessId()来获取窗口的进程ID,然后才能使用Process

[DllImport("user32.dll")]
public static extern IntPtr GetWindowThreadProcessId(IntPtr hWnd, out uint ProcessId);

[DllImport("user32.dll")]
private static extern IntPtr GetForegroundWindow();

string GetActiveProcessFileName()
{
    IntPtr hwnd = GetForegroundWindow();
    uint pid;
    GetWindowThreadProcessId(hwnd, out pid);
    Process p = Process.GetProcessById((int)pid);
    p.MainModule.FileName.Dump();
}

请注意,当活动进程为64位时,从32位应用程序运行时,这似乎会引发异常(“32位进程无法访问64位进程的模块”)。

编辑:正如Damien指出的那样,此代码很容易出现竞争条件,因为GetForegroundWindow()被调用时具有活动窗口的进程可能不再存在{ {1}}被调用。更糟糕的情况是,如果当时将相同的hwnd分配给另一个窗口,但我想这应该是非常罕见的。

答案 1 :(得分:7)

我建议使用System.Diagnostics.Process

var currentProc = System.Diagnostics.Process.GetCurrentProcess();
string name = currentProc.ProcessName;

作为替代方案,您可以使用:

string name = currentProc.MainModule.FileName;

答案 2 :(得分:3)

它只需要两行代码,你可以使用linq来获取所有进程。

var processss = from proc in System.Diagnostics.Process.GetProcesses() orderby proc.ProcessName ascending select proc;
foreach (var item in processss) {
    Console.WriteLine(item.ProcessName );
}

现在,您可以通过网络获得所有活动流程。

答案 3 :(得分:1)

这是一个描述您想要做的事情的链接:

http://www.blackwasp.co.uk/GetActiveProcess.aspx

另一个描述GetForegroundWindow函数的函数,我在下面复制。

请注意,您可能需要引用一些额外的程序集,以使此代码有效。 查看每个函数的MSDN。例如,GetProcessesByName需要System.Diagnostics。

public ApplicationState AppState
{
    get
    {
        Process[] processCollection =
                           Process.GetProcessesByName(ProcessName);
        if(processCollection != null && 
           processCollection.Length  >= 1 && 
            processCollection[0] != null)
        {
            IntPtr activeWindowHandle = Win32.GetForegroundWindow();
            // Optional int ProcessID;
            // Optional Win32.GetWindowThreadProcessId(
                                                 GetForegroundWindow(), 
                                                 out ProcessID)
            foreach(Process wordProcess in processCollection)
            {
                //Optional if( ProcessID == wordProcess.Id )
                //          return ApplicationState.Focused;
                if(wordProcess.MainWindowHandle == activeWindowHandle)
                {
                    return ApplicationState.Focused;
                }
            }

            return ApplicationState.Running;
        }

        return ApplicationState.NotRunning;
    }
} 

答案 4 :(得分:0)

    public void GetProcessNames()
    {
        List<string> windowNames = new List<string>();

        foreach (Process window in Process.GetProcesses())
        {
            if (window.MainWindowHandle != IntPtr.Zero)
            {                    
                windowNames.Add(window.MainWindowTitle);
            }

            // It's that simple
        }
    }