Как получить имя активного процесса в С#?
Я знаю, что я должен использовать этот код:
[DllImport("user32.dll")]
private static extern IntPtr GetForegroundWindow();
но я не знаю, как использовать его.
Как получить имя активного процесса в С#?
Я знаю, что я должен использовать этот код:
[DllImport("user32.dll")]
private static extern IntPtr GetForegroundWindow();
но я не знаю, как использовать его.
Как упоминалось в этом ответе, вы должны использовать GetWindowThreadProcessId()
, чтобы получить идентификатор процесса для окна, а затем вы можете использовать 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();
}
Помните, что это похоже на исключение ( "32-разрядные процессы не могут получить доступ к модулям 64-битного процесса" ) при запуске из 32-разрядного приложения, когда активный процесс является 64-разрядным.
EDIT: Как отметил Дэмиен, этот код подвержен условиям гонки, потому что процесс, который имел активное окно во время вызова GetForegroundWindow()
, может не существовать больше, когда GetWindowThreadProcessId()
называется. Еще хуже было бы, если бы тот же 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;
}
}