11

時々私はタイピングをしていて、何かが焦点を奪うことはめったにありません、私はいくつかの解決策を読みました(VB時計でさえ)が、それらは私には当てはまりません。フォーカスの変更を処理するウィンドウ全体の「ハンドル」はありますか?

どの言語で、C、C ++、VB.NET、C#、.NETまたはWindowsに関連するもの、バッチ、PoweShell、VBSスクリプト...すべてのフォーカスの変更を監視してログインできる限り、関係ありません。ファイル/cmdウィンドウ/ビジュアルウィンドウ。

何かのようなもの:

   void event_OnWindowsFocusChange(int OldProcID, int NewProcID);

非常に便利です。あるいは、これのためのツールがすでにあるかもしれません(私は見つけることができませんか?)

4

2 に答える 2

19

1つの方法は、WindowsUIオートメーションAPIを使用することです。グローバルフォーカス変更イベントを公開します。これが私が思いついた簡単なサンプルです(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);
                }
            }
        }
    }
}
于 2012-07-29T21:04:15.247 に答える
2

フックでフォーカスの変化をモニターできます。SetWindowsHookEx()、WH_SHELLフックを使用してそれを実行します。コールバックはHSHELL_WINDOWACTIVATED通知を受け取ります。

これは、注入可能なDLLが必要なため、特にマネージド言語では簡単に実行できません。また、意図したフォーカスの変更と、ウィンドウを押し込んでフォーカスを盗んだプロセスとの違いを確実に見分けることもできません。どのWindowsが阻止しようとしますが、そのコードをだますためのAttachThreadInput()と呼ばれるバックドアがあります。

どのプロセスがこれを行うのかを判断することは決して難しいことではありません。結局のところ、それはそのウィンドウの1つをアクティブ化しようとしました。そのプログラムをアンインストールするのが簡単で最良の修正です。

于 2012-07-29T18:13:36.330 に答える