有没有办法获得任何窗口中点击的内容?

时间:2010-11-30 14:28:06

标签: c# windows winapi

我设法在http://www.codeproject.com/KB/cs/globalhook.aspx的代码中使用C#和Win32 API获取mousse点击事件的位置(x,y)(使用版本1,因为我的版本2有问题) 但我想知道点击的是什么而不是屏幕上的位置。 例如,单击MS Word中的“粗体按钮”。 有没有办法存档?

提前致谢。

2 个答案:

答案 0 :(得分:1)

您可以从WindowFromPointChildWindowFromPointEx获取窗口句柄,然后使用GetWindowInfo等查询窗口句柄。我不认为从Word中识别按钮有一种简单的方法但是。

答案 1 :(得分:0)

查看属于UI自动化的AutomationElement.FromPoint() - 这套API通常由希望获取有关其他进程UI的信息的自动化测试和辅助功能应用程序使用。对于支持它的应用程序(Windows和大多数MS应用程序中的大多数UI),您可以获取有关UI元素的信息,而不仅仅是外部窗口。此示例应用程序打印出光标下项目的名称和类型(例如“按钮”)。

它在任何地方都不受支持,可能无法在许多非MS应用程序中运行(尽管Firefox支持);但至少会比WindowFromPoint等更好的结果。

// Compile using: csc ItemAtPoint.cs /r:UIAutomationClient.dll /r:WindowsBase.dll

using System;
using System.Windows.Automation;
using System.Windows.Forms;

class ItemAtPoint
{
    public static void Main()
    {
        Console.WriteLine("Place pointer over item and hit return...");
        Console.ReadLine();

        // Get the AutomationElement that represents the window handle...
        System.Windows.Point point = new System.Windows.Point(Cursor.Position.X, Cursor.Position.Y);
        AutomationElement el = AutomationElement.FromPoint(point);

        // Print out the type of the item and its name
        Console.WriteLine("item is a \"{0}\" with name \"{1}\"", el.Current.LocalizedControlType, el.Current.Name);
    }
}