簡體   English   中英

如何檢查哪個程序是重點?

[英]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'

我做錯了什么?

這對我有用,因為它返回活動窗口名稱,所以略有不同:

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;

您正在將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 {
        ...
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM