我该如何检查哪个程序处于焦点状态?

3
我是一个帮助翻译文字的助手。

我想让一个计时器每隔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'

我做错了什么?

@Grant 对不起,我已经修复了。 - Nathan
1
@Clivens,很抱歉,对你来说这个解释可能有意义,但我今天第一次开始学习C#,英语不是我的主要语言,所以如果我在网上找不到一个可行的例子,理解这些困难的概念对我来说真的很难。如果我寻求帮助,我不知道为什么你会评判或怀疑我?显然我没有能够在互联网上找到我想要的东西。 - Nathan
2个回答

7
这对我有用,略有不同,因为它返回活动窗口的名称:
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();

以下内容将为您提供实际的窗口标题文本:
string processName = clsProcess.MainWindowTitle;

-1
你正在将由GetForegroundWindow()返回的IntPtrProcess[]进行比较。 正如名称所示,Process.GetProcessesByName可以返回多个进程,因此您需要将其视为数组。

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 {
        ...
    }
}

谢谢您的快速回复!您介意给我展示一下如何做吗?因为我对C#非常陌生(今天才开始学习),通常我通过分析现有代码来学习编程语言。非常感谢您提前的帮助! :-) - Nathan
对我来说,原文并没有起作用。然而,要让它起作用:请将 p.Handle 替换为 p.MainWindowHandle - stigzler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接