我正在编写一个C#应用程序。我正在寻找一种方法,通过给出鼠标点击的坐标(或任何坐标)来找到其他应用程序中控件的窗口句柄。
示例:在我的桌面上,我打开了计算器应用程序,打开了记事本,并运行了其他一些第三方应用程序。屏幕由每个部分覆盖。现在,如果我运行我的应用程序,如果我点击屏幕上的任何位置,我希望能够找到鼠标下控件的窗口句柄(按钮,文本框,标签,标签,框架等),无论是否它被点击了计算器中的按钮,记事本中的文件菜单或第三方应用程序中的其他控件。它类似于我们从Spy ++获得的功能。
答案 0 :(得分:2)
我不认为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签名 即,WindowFromPoint和EnumChildWindows 请参阅"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();
}
您只需在代码中调用此方法即可检索窗口的前景句柄: