我正在使用.Net c#winforms。我想将鼠标移到另一个应用程序上,当我将鼠标移到它的界面上时,看到cusor X,Y位置。在我的表单标题栏上显示X,Y即可。我希望在此应用程序的表单中查看特定位置的X,Y位置。
我想这样做的原因是因为这个应用程序的界面上有控件,我可以通过鼠标点击它来旋转一个旋钮,每个旋钮转一圈鼠标。我想编写一个应用程序,我可以将鼠标光标定位到此应用程序表单上的特定X,Y位置,然后单击软件鼠标将同一个旋钮转动一圈。但我想从我的应用程序中做到这一点,有点像遥控器,我想你可以说。当您在正确的X,Y位置时,其他app旋钮会响应鼠标点击。
感谢您指出正确的方向。
答案 0 :(得分:2)
向表单添加标签并连接其MouseMove()和QueryContinueDrag()事件。使用WindowFromPoint()和GetAncestor()API获取包含光标位置的主窗口的句柄,然后使用ScreenToClient()API将屏幕坐标转换为该窗体的客户端坐标。运行该应用程序,然后将表单中的标签拖到目标应用程序中的旋钮上。标题栏应该使用当前鼠标位置相对于其结束的应用程序的客户端坐标进行更新:
private const uint GA_ROOT = 2;
[System.Runtime.InteropServices.StructLayout(System.Runtime.InteropServices.LayoutKind.Sequential)]
public struct POINT
{
public int X;
public int Y;
}
[System.Runtime.InteropServices.DllImport("user32.dll")]
private static extern IntPtr WindowFromPoint(int xPoint, int yPoint);
[System.Runtime.InteropServices.DllImport("user32.dll", ExactSpelling = true)]
private static extern IntPtr GetAncestor(IntPtr hwnd, uint gaFlags);
[System.Runtime.InteropServices.DllImport("user32.dll")]
private static extern bool ScreenToClient(IntPtr hWnd, ref POINT lpPoint);
private void label1_MouseMove(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
label1.DoDragDrop(label1, DragDropEffects.Copy);
}
}
private void label1_QueryContinueDrag(object sender, QueryContinueDragEventArgs e)
{
Point pt = Cursor.Position;
IntPtr wnd = WindowFromPoint(pt.X, pt.Y);
IntPtr mainWnd = GetAncestor(wnd, GA_ROOT);
POINT PT;
PT.X = pt.X;
PT.Y = pt.Y;
ScreenToClient(mainWnd, ref PT);
this.Text = String.Format("({0}, {1})", PT.X.ToString(), PT.Y.ToString());
}