如何在C#中获取活动进程名称?
我知道我必须使用这段代码:
[DllImport("user32.dll")]
private static extern IntPtr GetForegroundWindow();
但我不知道如何使用它。
答案 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
}
}