2

ブラウザの URL を監視するアプリケーションがあります。現在、私はクロムを使用しています。私はこの答えから解決策に従いました:

public static string GetChromeUrl(Process process) {
    if (process == null)
        throw new ArgumentNullException("process");
    if (process.MainWindowHandle == IntPtr.Zero)
        return null;
    AutomationElement element = AutomationElement.FromHandle(process.MainWindowHandle);
    if (element == null)
        return null;
    AutomationElement edit = element.FindFirst(TreeScope.Children, new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Edit));
    return ((ValuePattern)edit.GetCurrentPattern(ValuePattern.Pattern)).Current.Value as string;
}

次に、URL をテキスト ファイルに記録する次の方法があります (log4net を使用)。

while (true) {
    foreach (Process process in Process.GetProcessesByName("chrome")) {
        string url = GetChromeUrl(process);
        if (url == null)
            continue;
        Console.WriteLine(url); //for viewing purpose, it actually logs in orig code
    }
    Thread.Sleep(1000);
}

それはかなりうまくいきます。しかし、どういうわけか方法に矛盾がありGetChromeUrlます。が返されることもありますがnull、これが私の大きな問題です。誰かがより良い解決策を持っていますか?

4

1 に答える 1

1

null を返すビットは? Windows は、ShowInTaskbar プロパティが変更されたプログラムを見落とすことがよくあります。これが、最初のチェック (および 2 番目) での null の理由である可能性があります。2番目の障害に関しては、私は何の助けも提供できませんが、数週間前に同じ問題がありました. Chrome の URL バーの position 要素を使用し、カーソル位置をそれに変更してから、カーソルの下の AutomationElement を取得することにしました。

    Form1_Load()
    {
        Cursor.Position = element's position;
        Timer.Start();
    }

    Timer_Tick()
    {
        AutomationElement element = AutomationElement.FromPoint(new System.Windows.Point(mouse.X, mouse.Y));
            string current = element.Current.Name;
        Console.WriteLine(current); //log in text file...
    }

これはあなたの質問に対する答えを提供しますか?

于 2013-07-09T02:23:24.033 に答える