C#/WINAPI:SetWindowPos()

C#/WINAPI:SetWindowPos(),c#,windows,winapi,C#,Windows,Winapi,我正在使用尝试将窗口发送到z顺序的后面/前面。 它似乎在大多数情况下都能工作,但我注意到,对于某些窗口,它无法工作,尽管该函数将返回成功 例如,窗口任务管理器似乎工作得很好,但其他窗口没有正确响应函数调用 对可能发生的事情有什么见解吗?我知道信息很少,但我不确定要包括什么。使用setforegroundindow似乎很有效。 据我所知,使用SetWindowPos并将窗口设置为HWND_TOP将使其位于前景窗口之后的z顺序的顶部。 这意味着,一旦前景窗口被删除(最小化/关闭),它将成为顶部的下一

我正在使用尝试将窗口发送到z顺序的后面/前面。 它似乎在大多数情况下都能工作,但我注意到,对于某些窗口,它无法工作,尽管该函数将返回成功

例如,窗口任务管理器似乎工作得很好,但其他窗口没有正确响应函数调用


对可能发生的事情有什么见解吗?我知道信息很少,但我不确定要包括什么。

使用
setforegroundindow
似乎很有效。 据我所知,使用
SetWindowPos
并将窗口设置为
HWND_TOP
将使其位于前景窗口之后的z顺序的顶部。
这意味着,一旦前景窗口被删除(最小化/关闭),它将成为顶部的下一个窗口。

我也有跨进程的hod问题。这来自MS文档:

要使用
SetWindowPos
将窗口置于顶部,拥有该窗口的进程必须具有
SetForegroundWindow
权限


可能是原因吗?

还有一个问题,如果在SetWindowPos中设置,我找不到HWND_TOP和HWND_NotopHost之间的区别。两者都将窗口设置为Z顺序的顶部,就在最顶部窗口的下方?是否应改为使用SetForegroundWindow?似乎它做了很多额外的事情,比如设置我不关心的进程优先级……我想补充一点,仅仅调用setForeGroundIndow是不够的。考虑窗口是前视窗的情况,但是我手动将窗口设置为z顺序的后面。再次调用foregroundindow不会使其达到z顺序的顶部。因此,必须进行两次调用:1)SetForeGroundIndow(如果窗口是ForeGroundIndow,则先检查);2)SetWindowPos(新的IntPtr(windowID),HWND_TOP,0,0,0,(SWP_NOSIZE | SWP_NOMOVE));