Winapi 如何从拖放目标确定拖放操作的源进程/hWnd

Winapi 如何从拖放目标确定拖放操作的源进程/hWnd,winapi,drag-and-drop,findwindow,clipboarddata,idataobject,Winapi,Drag And Drop,Findwindow,Clipboarddata,Idataobject,我的C#Windows应用程序接受拖动操作,我希望能够识别源的hWnd和/或进程ID。这可能吗?我将如何确定它 我曾尝试在开始拖动时获取活动窗口,但如果用户在拖动操作期间激活了其他窗口(例如,按Alt+Tab一次或多次),则这不是很可靠 我也尝试过检查IDataObject上的格式,但该签名不足以可靠地识别源窗口。我认为没有正式的方法来做到这一点(虽然操作系统显然知道哪个线程当前在DoDragDrop()循环中,但我不记得曾经看到过查询该线程的函数)。除非在每个正在运行的进程中手动钩住DoDra

我的C#Windows应用程序接受拖动操作,我希望能够识别源的hWnd和/或进程ID。这可能吗?我将如何确定它

我曾尝试在开始拖动时获取活动窗口,但如果用户在拖动操作期间激活了其他窗口(例如,按Alt+Tab一次或多次),则这不是很可靠


我也尝试过检查IDataObject上的格式,但该签名不足以可靠地识别源窗口。

我认为没有正式的方法来做到这一点(虽然操作系统显然知道哪个线程当前在
DoDragDrop()
循环中,但我不记得曾经看到过查询该线程的函数)。除非在每个正在运行的进程中手动钩住
DoDragDrop()
,否则没有其他方法可以发现源代码。这是故意的!拖放框架被抽象为故意对目标隐藏这些细节。即使你能确定来源,你为什么需要这些信息?你打算用它做什么?谢谢@RemyLebeau-我想可能是这样的。我正在尝试获取有关被拖动项的一些上下文,虽然我已经能够在只有一个源应用程序实例打开时使用IAccessible获取该细节,但如果源应用程序有多个实例,它并不总是可靠的。@ThunderFrame:“我正在尝试获取有关被拖动项的上下文”-但目的是什么?由于您无法发现源代码,所以您只需继续拖动
IDataObject
@RemyLebeau的内容,因为我正在拖动的某些项目在IDataObject中有足够的细节,但对于其他项目,我最好有一点只有源代码才能提供的额外上下文。如果我可以使用IAccessible获得源代码,我通常可以获得该细节。我只是想说明无法确定哪个IAccessible对象是正确对象的边缘情况。我不认为有正式的方法可以做到这一点(虽然操作系统显然知道哪个线程当前在
DoDragDrop()
循环中,但我不记得曾经看到过查询此线程的函数)。除非在每个正在运行的进程中手动钩住
DoDragDrop()
,否则没有其他方法可以发现源代码。这是故意的!拖放框架被抽象为故意对目标隐藏这些细节。即使你能确定来源,你为什么需要这些信息?你打算用它做什么?谢谢@RemyLebeau-我想可能是这样的。我正在尝试获取有关被拖动项的一些上下文,虽然我已经能够在只有一个源应用程序实例打开时使用IAccessible获取该细节,但如果源应用程序有多个实例,它并不总是可靠的。@ThunderFrame:“我正在尝试获取有关被拖动项的上下文”-但目的是什么?由于您无法发现源代码,所以您只需继续拖动
IDataObject
@RemyLebeau的内容,因为我正在拖动的某些项目在IDataObject中有足够的细节,但对于其他项目,我最好有一点只有源代码才能提供的额外上下文。如果我可以使用IAccessible获得源代码,我通常可以获得该细节。我只是想讨论一下无法确定哪个IAccessible对象是正确对象的边缘情况。