如何检查哪个程序处于焦点状态?
How can I check which program is in focus?
我正在尝试让计时器每 250 毫秒检查一次特定程序是否处于焦点状态,但我就是不知道如何...
当前代码:
using System.Diagnostics;
using System.Runtime.InteropServices;
namespace Hearthstone_Test
{
public partial class Main : Form
{
private void timer1_Tick(object sender, EventArgs e)
{
var activatedHandle = GetForegroundWindow();
if (GetForegroundWindow() == Process.GetProcessesByName("Hearthstone"));
{
Console.WriteLine("Not Focused"); // No window is currently activated
}
else
{
Console.WriteLine("Focused");
}
var procId = Process.GetCurrentProcess().Id;
int activeProcId;
GetWindowThreadProcessId(activatedHandle, out 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);
}
}
错误在第 11 行:
Operator '==' cannot be applied to operands of type 'Process[]' and 'IntPtr'
我做错了什么?
您正在比较由 GetForegroundWindow()
编辑的 IntPtr
return 与 Process[]
。
顾名思义,Process.GetProcessesByName
可以 return 多个进程,因此您需要将其视为一个数组。
将 Process.GetProcessesByName("Hearthstone")
保存到一个变量中,并遍历每个条目以查看它是否是焦点所在的条目。
此外,您假设句柄是进程 ID;事实并非如此。以下代码未经测试。
...
var processes = Process.GetProcessesByName("Hearthstone");
foreach(Process p in processes) {
if(activedHandle == p.Handle) {
//A instance of the process Hearthstone is currently focused.
...
} else {
...
}
}
这对我有用,因为它 returns 活跃的 window 名称略有不同:
public string getActiveWindowName()
{
try
{
var activatedHandle = GetForegroundWindow();
Process[] processes = Process.GetProcesses();
foreach (Process clsProcess in processes)
{
if(activatedHandle == clsProcess.MainWindowHandle)
{
string processName = clsProcess.ProcessName;
return processName;
}
}
}
catch { }
return null;
}
[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
private static extern IntPtr GetForegroundWindow();
以下将为您提供实际的 window header 文本:
string processName = clsProcess.MainWindowTitle;
我正在尝试让计时器每 250 毫秒检查一次特定程序是否处于焦点状态,但我就是不知道如何...
当前代码:
using System.Diagnostics;
using System.Runtime.InteropServices;
namespace Hearthstone_Test
{
public partial class Main : Form
{
private void timer1_Tick(object sender, EventArgs e)
{
var activatedHandle = GetForegroundWindow();
if (GetForegroundWindow() == Process.GetProcessesByName("Hearthstone"));
{
Console.WriteLine("Not Focused"); // No window is currently activated
}
else
{
Console.WriteLine("Focused");
}
var procId = Process.GetCurrentProcess().Id;
int activeProcId;
GetWindowThreadProcessId(activatedHandle, out 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);
}
}
错误在第 11 行:
Operator '==' cannot be applied to operands of type 'Process[]' and 'IntPtr'
我做错了什么?
您正在比较由 GetForegroundWindow()
编辑的 IntPtr
return 与 Process[]
。
顾名思义,Process.GetProcessesByName
可以 return 多个进程,因此您需要将其视为一个数组。
将 Process.GetProcessesByName("Hearthstone")
保存到一个变量中,并遍历每个条目以查看它是否是焦点所在的条目。
此外,您假设句柄是进程 ID;事实并非如此。以下代码未经测试。
...
var processes = Process.GetProcessesByName("Hearthstone");
foreach(Process p in processes) {
if(activedHandle == p.Handle) {
//A instance of the process Hearthstone is currently focused.
...
} else {
...
}
}
这对我有用,因为它 returns 活跃的 window 名称略有不同:
public string getActiveWindowName()
{
try
{
var activatedHandle = GetForegroundWindow();
Process[] processes = Process.GetProcesses();
foreach (Process clsProcess in processes)
{
if(activatedHandle == clsProcess.MainWindowHandle)
{
string processName = clsProcess.ProcessName;
return processName;
}
}
}
catch { }
return null;
}
[DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
private static extern IntPtr GetForegroundWindow();
以下将为您提供实际的 window header 文本:
string processName = clsProcess.MainWindowTitle;