使用C#在Windows 10中获取当前活动的应用程序名称

时间:2017-09-12 12:47:28

标签: c#

我尝试获取当前活动的应用程序名称(或进程名称),但在某些应用程序(如Microsoft Edge)中是结果ApplicationFrameHost。有没有办法获得应用程序名称,如在任务管理器?

我的实际代码:

    [DllImport("user32.dll")]
    static extern IntPtr GetForegroundWindow();
    [DllImport("user32.dll")]
    static extern int GetWindowText(IntPtr hWnd, StringBuilder text, int count);
    [DllImport("user32.dll")]
    public static extern IntPtr GetWindowThreadProcessId(IntPtr hWnd, out uint processId);

            private string GetActiveProcess()
    {

        const int nChars = 256;
        uint processId;
        StringBuilder Buff = new StringBuilder(nChars);
        IntPtr handle = GetForegroundWindow();

        if (GetWindowText(handle, Buff, nChars) > 0)
        {
            GetWindowThreadProcessId(handle, out processId);
            return Process.GetProcessById((int)processId).ProcessName;
        }
        return null;
    }

2 个答案:

答案 0 :(得分:1)

此解决方案在表单应用程序中看起来很有用:

        //aktivneOknoProces
        string aktivneOknoProces = GetActiveProcess();

private string GetActiveProcess()
        {
            string app = "";
            var foregroundProcess = Process.GetProcessById(WinAPIFunctions.GetWindowProcessId(WinAPIFunctions.GetforegroundWindow()));
            if (foregroundProcess.ProcessName == "ApplicationFrameHost")
            {
                foregroundProcess = GetRealProcess(foregroundProcess);
            }
            if(foregroundProcess != null)
            {
                app = foregroundProcess.ProcessName;
            }
            return app;
        }

        private Process GetRealProcess(Process foregroundProcess)
        {
            WinAPIFunctions.EnumChildWindows(foregroundProcess.MainWindowHandle, ChildWindowCallback, IntPtr.Zero);
            return _realProcess;
        }

        private bool ChildWindowCallback(IntPtr hwnd, IntPtr lparam)
        {
            var process = Process.GetProcessById(WinAPIFunctions.GetWindowProcessId(hwnd));
            if (process.ProcessName != "ApplicationFrameHost")
            {
                _realProcess = process;
            }
            return true;
        }

        public class WinAPIFunctions
        {
            //Used to get Handle for Foreground Window
            [DllImport("user32.dll", CharSet = CharSet.Auto)]
            private static extern IntPtr GetForegroundWindow();

            //Used to get ID of any Window
            [DllImport("user32.dll", CharSet = CharSet.Auto)]
            private static extern int GetWindowThreadProcessId(IntPtr hWnd, out int lpdwProcessId);
            public delegate bool WindowEnumProc(IntPtr hwnd, IntPtr lparam);

            [DllImport("user32.dll")]
            [return: MarshalAs(UnmanagedType.Bool)]
            public static extern bool EnumChildWindows(IntPtr hwnd, WindowEnumProc callback, IntPtr lParam);

            public static int GetWindowProcessId(IntPtr hwnd)
            {
                int pid;
                GetWindowThreadProcessId(hwnd, out pid);
                return pid;
            }

            public static IntPtr GetforegroundWindow()
            {
                return GetForegroundWindow();
            }
        }

答案 1 :(得分:0)

我相信你要找的是:

Process.GetCurrentProcess().ProcessName

GetCurrentProcess

ProcessName

那应该给你一个名义的过程