如何在单击鼠标的应用程序中找到控件的窗口句柄

时间:2014-03-20 11:06:34

标签: c# windows controls handle

我正在编写一个C#应用程序。我正在寻找一种方法,通过给出鼠标点击的坐标(或任何坐标)来找到其他应用程序中控件的窗口句柄。

示例:在我的桌面上,我打开了计算器应用程序,打开了记事本,并运行了其他一些第三方应用程序。屏幕由每个部分覆盖。现在,如果我运行我的应用程序,如果我点击屏幕上的任何位置,我希望能够找到鼠标下控件的窗口句柄(按钮,文本框,标签,标签,框架等),无论是否它被点击了计算器中的按钮,记事本中的文件菜单或第三方应用程序中的其他控件。它类似于我们从Spy ++获得的功能。

3 个答案:

答案 0 :(得分:2)

顺便说一下,这有already been done for you,听起来你需要的只是克隆回购然后自定义你的内容。

我不认为Global Hooks是必要的 您应该可以使用任意数量的方法来获取光标位置,挂钩只会使事情变得复杂。例如,您可以尝试以下操作:

using System;
using System.Windows;
using System.Windows.Input;
using System.Runtime.InteropServices;

namespace Namespace1
{
    class Class1
    {
        [DllImport("user32.dll")]
        [return: MarshalAs(UnmanagedType.Bool)]
        internal static extern bool GetCursorPos(ref Win32Point pt);
        [StructLayout(LayoutKind.Sequential)]
        internal struct Win32Point
        {
            public Int32 X;
            public Int32 Y;
        };
        public static Point GetMousePosition()
        {
            Win32Point w32Mouse = new Win32Point();
            GetCursorPos(ref w32Mouse);
            return new Point(w32Mouse.X, w32Mouse.Y);
        }
    }
}

然后你需要一些Pinvoke签名 即,WindowFromPointEnumChildWindows 请参阅"Enumerating Windows/Controls of another application from .Net"

希望有所帮助。
祝好运。

答案 1 :(得分:0)

您必须为鼠标事件设置全局Windows挂钩。这将导致您的应用程序在外部窗口中获得鼠标(或键盘)。

请在Windows API上找到此article on code project作为示例C#包装器。 Windows API函数也在文章中列出

答案 2 :(得分:0)

使用Windows钩子进行鼠标事件(比如oleksa说)然后这个PInvoke获取前景窗口:http://www.pinvoke.net/default.aspx/user32.getforegroundwindow

    [DllImport("user32.dll")]
    private static extern IntPtr GetForegroundWindow();

    void yourFonction(){
       [...]
       IntPtr handleTopMostWindow = GetForegroundWindow();
    }

您只需在代码中调用此方法即可检索窗口的前景句柄: