Как получить активное имя процесса в С#?

Как получить имя активного процесса в С#?

Я знаю, что я должен использовать этот код:

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

но я не знаю, как использовать его.

Ответ 1

Как упоминалось в этом ответе, вы должны использовать 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 был назначен другому окну в то время, но я думаю, это должно быть очень редко.

Ответ 2

Я бы предложил использовать System.Diagnostics.Process.

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

В качестве альтернативы вы можете использовать:

string name = currentProc.MainModule.FileName;

Ответ 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 );
}

Теперь у вас есть все активные процессы, только в режиме онлайн.

Ответ 4

Здесь ссылка, описывающая то, что вы хотите сделать:

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