如何在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; } }