Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 像Winspector Spy一样拖放_C#_C++_Winapi_Drag And Drop - Fatal编程技术网

C# 像Winspector Spy一样拖放

C# 像Winspector Spy一样拖放,c#,c++,winapi,drag-and-drop,C#,C++,Winapi,Drag And Drop,我想知道是否有人能提供有关如何在Winspector Spy中实现窗口选择器的见解。基本上,我希望提供一个面板,我可以将鼠标放在上面,拖到另一个进程窗口(或子窗口)上,并从中获得类似HWND的内容。理想情况下,我会在C语言中这样做,但是如果只通过包装C API来实现,那么我可以在C++中完成。 我搞砸了DragDrop事件,用C#调用了DoDragDrop on mouse down,但不确定这是否能满足我的需求。仅仅获取鼠标的全局X/Y位置并在该位置找到最上面的窗口会更容易吗?在给定x,y参数

我想知道是否有人能提供有关如何在Winspector Spy中实现窗口选择器的见解。基本上,我希望提供一个面板,我可以将鼠标放在上面,拖到另一个进程窗口(或子窗口)上,并从中获得类似HWND的内容。理想情况下,我会在C语言中这样做,但是如果只通过包装C API来实现,那么我可以在C++中完成。 我搞砸了DragDrop事件,用C#调用了DoDragDrop on mouse down,但不确定这是否能满足我的需求。仅仅获取鼠标的全局X/Y位置并在该位置找到最上面的窗口会更容易吗?在给定x,y参数的情况下,是否有一个API可以自动为我实现这一点 编辑:刚刚发现后一个问题

导入: 使用System.Runtime.InteropServices

我的建议是,当鼠标位于窗体上时,处理鼠标移动/鼠标向上事件(要使用windows钩子捕获窗体外的鼠标,请看这里:),当鼠标按钮释放时,使用您提供的链接获取屏幕上的鼠标位置,并获取光标后面的窗口,如下所示:

[DllImport("user32.dll")]
public static extern IntPtr WindowFromPoint(Point lpPoint);
[DllImport("user32.dll")]
public static extern bool GetCursorPos(out Point lpPoint);
public static IntPtr GetWindowUnderCursor()
{
   Point ptCursor = new Point();
   if (!(PInvoke.GetCursorPos(out ptCursor)))
       return IntPtr.Zero;
   return WindowFromPoint(ptCursor);
}
现在你有了你的窗户把手,从那里你可以看到无限的可能性


注意:上面的链接(windows钩子)只有在窗体上发生鼠标下降时才起作用,并且钩子在鼠标抬起时结束。您只需将鼠标捕捉设置为“鼠标按下”,这样您就可以获得所有鼠标消息,即使它们在您自己的窗口之外。然后在鼠标向上移动时,使用WindowFromPoint


我不熟悉.NET,但使用Win32 API,可以使用SetCapture设置鼠标捕获。

当鼠标不在窗口上方时,通常不会收到鼠标消息。但为了进行拖放操作,您需要这样做。因此,Windows提供了一种称为鼠标捕获的机制。为了防止鼠标捕获被滥用,您只能在按下按钮的消息上捕获鼠标。一旦有了捕获,无论鼠标在屏幕上的什么位置,都会收到鼠标移动消息,直到释放捕获或Windows看到相应的按钮消息

<>这个C++代码看起来像这样的< /P>
 case WM_LBUTTONDOWN:
     { 
     SetCapture(hwnd);
     }
     break;

 case WM_MOUSEMOVE:
     if (GetCapture() == hwnd)
        {
        POINT pt = {GET_MOUSE_X(lParam), GET_MOUSE_Y(lParam));
        ClientToScreen(hwnd, &pt);
        HWND hwndAtPoint = WindowFromPoint(pt);
        // Show info for hwndAtPoint....
        }
     break;

  case WM_LBUTTONUP:
     if (GetCapture() == hwnd)
        {
        ReleaseCapture();
        }
     break;

  case WM_CANCELMODE:
     // this is a request from Windows that leave my modal state
     if (GetCapture() == hwnd)
        ReleaseCapture(hwnd);
     break;

  case WM_CAPTURECHANGED:
     // notification that I lost capture (I released it or it was taken from me)
     break;      
该函数有助于从该点的窗口转到拥有它的顶级窗口。可以用来绕着窗户树走

在.NET中,控件类有一个Capture属性,它执行与所看到的相同的操作

,可以查看C++源程序,类似于WiSwitter间谍程序的另一个窗口检查程序。虽然我不知道像这样的开源C程序,但是

你需要先考虑如何在窗口周围绘制矩形,这样会影响代码的其余部分。最简单的方法是使用一个窗体,该窗体的透明键设置为BackColor,FormBorderStyle设置为None。在Paint事件中绘制一个矩形,其大小与窗体的ClientRectangle相同,这将获得一个可见的矩形,其他所有内容都是透明的。设置窗体的Location和Size属性以匹配找到的窗口

现在从鼠标位置查找窗口。不能使用WINDOWONPOINT(),它不考虑禁用的窗口。您需要使用EnumWindows()。在回调中,调用GetWindowRect()并检查鼠标是否位于矩形内。确保忽略矩形绘图窗口

当获得匹配项时,现在使用GW_hwndprov重复调用GetWindow(),以查找与找到的窗口重叠的窗口。继续检查矩形并忽略矩形窗口

这最终将获得鼠标光标所在的顶级窗口。现在使用ChildWindowFromPoint()检查鼠标是否位于子窗口上(如果有的话)。如有必要,创建矩形绘图窗体,并将其设置为与找到的窗口相同的大小和位置

从MouseMove事件调用此代码,例如,一个显示公牛眼图形的PictureBox。在MouseDown事件中将其Capture属性设置为true


在MouseUp事件中关闭矩形绘图窗体的Close()方法。

既然您已经用C#标记了它,我可以为您正在尝试完成的这项工作添加一两个链接,希望能让您对如何实现这一点有必要的了解:

  • ''
  • ''
  • ''
  • ''