Как отслеживать изменения фокуса?

ну иногда я печатаю, и очень редко случается, что что-то крадет фокус, я читаю какое-то решение (даже часы VB), но они не относятся ко мне. Есть ли какой-либо дескриптор Windows, который обрабатывает любые изменения фокуса?

неважно, на каком языке, С, С++, VB.NET в C#, что угодно .Net или связанные Windows, пакета PoweShell, скрипт VBS... Пока я могу отслеживать каждое изменение фокуса и регистрировать его в окне file/cmd/visual.

что-то например:

   void event_OnWindowsFocusChange(int OldProcID, int NewProcID);

было бы очень полезно. Или, может быть, для этого уже есть инструменты (которые я не могу найти?)

2 ответов


один из способов-использовать API автоматизации пользовательского интерфейса windows. Он раскрывает глобальное событие изменения фокуса. Вот быстрый пример, который я придумал (в C#). Обратите внимание, вам нужно добавить ссылки на UIAutomationClient и UIAutomationTypes.

using System.Windows.Automation;
using System.Diagnostics;

namespace FocusChanged
{
    class Program
    {
        static void Main(string[] args)
        {
            Automation.AddAutomationFocusChangedEventHandler(OnFocusChangedHandler);
            Console.WriteLine("Monitoring... Hit enter to end.");
            Console.ReadLine();
        }

        private static void OnFocusChangedHandler(object src, AutomationFocusChangedEventArgs args)
        {
            Console.WriteLine("Focus changed!");
            AutomationElement element = src as AutomationElement;
            if (element != null)
            {
                string name = element.Current.Name;
                string id = element.Current.AutomationId;
                int processId = element.Current.ProcessId;
                using (Process process = Process.GetProcessById(processId))
                {
                    Console.WriteLine("  Name: {0}, Id: {1}, Process: {2}", name, id, process.ProcessName);
                }
            }
        }
    }
}

вы можете отслеживать изменения фокуса с крючком. SetWindowsHookEx (), используя крючок WH_SHELL, делает это. Обратный вызов получает уведомление HSHELL_WINDOWACTIVATED.

Это нелегко получить, особенно на управляемом языке, так как для этого требуется DLL, которая может быть введена. Также вы не могли достоверно сказать разницу между запланированным изменением фокуса или процессом, который толкнул окно и украл фокус. Который Windows пытается предотвратить, но есть бэкдор под названием AttachThreadInput (), который дурачит этот код.

Это не трудно сказать, какой процесс это делает. В конце концов, он попытался активировать одно из своих окон. Удаление этой программы является простым и лучшим решением.