【问题标题】:How can I check which program is in focus?如何检查哪个程序是焦点?
【发布时间】:2016-04-24 08:21:17
【问题描述】:

我试图让计时器每 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'

我做错了什么?

【问题讨论】:

  • 该错误实际上是在告诉您该行有什么问题。还有其他许多问题,如果您像您所说的那样搜索了几个小时,您就会知道如何检查前台进程。 SO 不是代码编写服务。发布stackoverflow.com/help/mcve
  • @Grant 对不起,我已经修好了。
  • @Clivens 很抱歉,但对你来说这个解释可能有道理,但我今天第一次开始学习 C#,英语不是我的主要语言,所以理解这些困难的概念真的很难如果我在网上找不到一个可行的例子。我不知道你为什么会评判或怀疑我,如果我寻求帮助,显然我无法在互联网上找到我想要的东西?

标签: c# window focus


【解决方案1】:

这对我有用,但在返回活动窗口名称时略有不同:

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;

【讨论】:

    【解决方案2】:

    您将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# 非常陌生(从今天开始),我通常通过分析现有代码来学习编程语言。非常感谢您! :-)
    • 不适合我。但是要使其正常工作:将 p.Handle 替换为 p.MainWindowHandle
    猜你喜欢
    • 1970-01-01
    • 2022-01-11
    • 2011-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多