我如何返回false或true每个进程,以便我可以监控进程是否在前面

本文关键字:进程 我可以 在前面 是否 监控 true 何返回 返回 false | 更新日期: 2023-09-27 18:01:55

在form1中我有一个定时器:

private void Form1_Load(object sender, EventArgs e)
        {
            System.Windows.Forms.Timer t1 = new System.Windows.Forms.Timer();
            t1.Interval = 50;
            t1.Tick += new EventHandler(timer1_Tick);
            t1.Enabled = true;
        }

滴答事件:

private void timer1_Tick(object sender, EventArgs e)
        {
           label4.Text =  SetProcessWindow.ApplicationIsActivated().ToString();           
        }

和ApplicationIsActivated方法:

public static bool ApplicationIsActivated()
        {
            Process[] Processes = Process.GetProcesses();
            foreach (Process SingleProcess in Processes)
            {
                var activatedHandle = GetForegroundWindow();
                if (activatedHandle == IntPtr.Zero)
                {
                    return false;
                }
                var procId = SingleProcess.Id;//Process.GetCurrentProcess().Id;
                int activeProcId;
                GetWindowThreadProcessId(activatedHandle, out activeProcId);
                return activeProcId == procId;
            }            
        }

我想以某种方式监控进程,如果我将任何进程移到前面,然后在form1的label4中显示它。

ApplicationIsActivated写得不好。首先,我不确定是否使foreach每次都是好的,其次,我不确定如何返回activeProcId == procId;每个进程。

我如何返回false或true每个进程,以便我可以监控进程是否在前面

无需检查每个进程是否已激活,直接查找已激活的进程:

Process FindActivatedProcess()
{
    var activatedHandle = GetForegroundWindow();
    if (activatedHandle == IntPtr.Zero)
        return null;    // No window has focus
    int activeProcId;
    GetWindowThreadProcessId(activatedHandle, out activeProcId);
    return Process.GetProcessById(activeProcId);
}
[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
private static extern IntPtr GetForegroundWindow();
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern int GetWindowThreadProcessId(IntPtr handle, out int processId);

要确定激活的应用程序何时发生变化,您可以像现在一样进行轮询(尽管我建议更大的间隔- 50ms对我来说似乎有点夸张),或者您可以要求Windows在发生变化时通知您。