C# 如何获取下一个选定窗口?

C# 如何获取下一个选定窗口?,c#,winapi,hwnd,C#,Winapi,Hwnd,我正在编写一个应用程序,对选定的窗口进行一些更改。我试图弄清楚如何在按下c中的按钮后选择窗口的HWND 流程将类似于: 用户按下一个显示“选择窗口”的表单按钮,表单隐藏起来,不允许选择自身,用户单击桌面上的另一个窗口,这可以是任何应用程序,表单重新显示并收集所选窗口的HWND,程序使用HWND执行其业务 我不知道怎么做的部分是获取选择了哪个窗口 任何帮助都将不胜感激 一种方法是 在应用程序中添加一个 最小化您的应用程序 当全局事件处理程序检测到鼠标单击时: 调用GetForegroundWind

我正在编写一个应用程序,对选定的窗口进行一些更改。我试图弄清楚如何在按下c中的按钮后选择窗口的HWND

流程将类似于:

用户按下一个显示“选择窗口”的表单按钮,表单隐藏起来,不允许选择自身,用户单击桌面上的另一个窗口,这可以是任何应用程序,表单重新显示并收集所选窗口的HWND,程序使用HWND执行其业务

我不知道怎么做的部分是获取选择了哪个窗口

任何帮助都将不胜感激

一种方法是

在应用程序中添加一个 最小化您的应用程序 当全局事件处理程序检测到鼠标单击时: 调用GetForegroundWindow
一个选项是轮询API,直到HWND更改为另一个窗口。

执行类似操作的“经典”方法-以及允许您选择要检查或使用的UI的各种其他应用程序-类似于:这是从C++/Win32 API的角度编写的,但是,除了WindowFromPoint和GetSenator之外,大多数步骤都有.Net等价物

有一个显示十字线的UI,它响应WM_LBUTTONDOWN/Control.MouseDown 当鼠标点击时, 使用SetCapture/来“捕获”鼠标:这是一个神奇的部分,只要按住左键,HWND就会接收所有进一步的鼠标移动事件。这意味着你不需要钩子或类似的东西。, 使用SetCursor将光标设置为合适的位置,例如十字光标。 在某个地方设置一个标志,以便您可以区分在拖动/捕获期间将要获得的鼠标移动事件,以及如果用户只是正常地将鼠标移动到您的控件上,您将获得的鼠标移动事件。 现在,当用户在屏幕上移动十字线指针时,您将获得WM_MOUSEMOVE/Control.MOUSEMOVE事件-检查您前面设置的标志,以确保这是在“拖动”期间。使用ClientToScreen/Control.PointToScreen从移动事件中的控件相对坐标获取屏幕坐标,使用WindowFromPoint获取该位置的最下级窗口,使用GetAncestorGA_ROOT获取顶级窗口。如果您关心的话,可以检查窗口是否设置了WS_标题,以确保它是一个带有标题栏的窗口。你可能还想过滤掉任务栏和桌面窗口。您还可以使用诸如GetWindowThreadProcessID之类的API从您自己的进程中过滤出窗口。如果HWND是一个可行的候选者,请将其保存在某个地方。如果仍然存在一些UI,甚至可以使用GetWindowText获取窗口的标题和/或其他详细信息,并提供有关用户拖动时可能选择哪个窗口的实时反馈。 当用户释放鼠标位置时,您将获得WM_LBUTTONUP/Control.MouseUp-用户已完成拖动。释放捕获,将图标和光标恢复到用户按下鼠标之前的状态,然后继续使用保存的HWND(如果有)。 在拖动过程中处理ESC以取消操作也被认为是礼貌的

而且,上面的内容对键盘不友好;在应用程序的生命周期内,或者在选择对话框出现时,将RegisterHotkey与一些热键一起使用也是一个好主意,并使用GetForeGroundIndow响应热键,如其他回复中所述