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

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

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

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

但我不知道怎么用它。

如本回答所述 ,您必须使用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位应用程序运行时,这似乎会引发exception(“32位进程无法访问64位进程的模块”)。

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

我建议使用System.Diagnostics.Process

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

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

 string name = currentProc.MainModule.FileName; 

它只需要两行代码,你可以使用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 ); } 

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

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

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; } }