我如何返回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;每个进程。
无需检查每个进程是否已激活,直接查找已激活的进程:
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在发生变化时通知您。