我正在制作另一个应用程序窗口,以确保我的应用程序中的单击将对方的对话框带入视图。我遇到的问题是我在通话结束后没有把注意力集中到我的应用上。如果其他应用程序有更多的窗口,其中一个最终会有焦点,否则没有窗口(仅查看任务栏)获得焦点。我应该在哪里开始调查这个问题?
我使其他应用程序最顶层的代码是:
Process p = Process.GetProcessById(trackedProcessID);
IntPtr h = p.MainWindowHandle;
uint TOPMOST_FLAGS = SWP_NOMOVE | SWP_NOSIZE | SWP_ASYNCWINDOWPOS;
SetWindowPos(h, HWND_TOPMOST, 0, 0, 0, 0, TOPMOST_FLAGS);
常量为
public static readonly uint SWP_NOMOVE = 0x0002;
public static readonly uint SWP_NOSIZE = 0x0001;
public static readonly uint SWP_ASYNCWINDOWPOS = 0x4000;
public static readonly IntPtr HWND_TOPMOST = new IntPtr(-1);
答案 0 :(得分:2)
相关:Unexpected behaviour of Process.MainWindowHandle
基本上,MainWindowHandle为您提供了当前最顶层的流程窗口,尽管文档说明了这一点。
这解释了为什么你的其他过程的主窗口不一定得到关注。
您的其他问题是因为您在弃用后没有将焦点恢复到您的应用。
实际上,正确的术语是建立z-order。
您可能最好不要将消息发送到其他进程,而不是尝试控制z顺序(无法保证)。
答案 1 :(得分:2)
你试过SWP_NOACTIVATE吗?
答案 2 :(得分:0)
[使用的实际解决方案]
到目前为止,我要将调用窗口的窗口句柄发送到目标应用程序,并在完成后将其推回到顶部。这是一个真正的痛苦,因为我将有50个窗口来处理,但它似乎稳定。下一个方法,如果事实证明有问题,将回调调用应用程序并要求它将窗口推到前台,但我不愿意,因为它引入了用户可以做某事的可能性消息在传输过程中调用应用程序(如果有很多消息在同一传输协议上进入,则只会出现问题,这很可能发生)
不要尝试使用传入的窗口句柄并将目标应用程序中显示的任何窗口的父窗口设置为该句柄,它只会使显示的对话框显示在调用应用程序窗口的边界内,并在必要时裁剪 - 无用
非常感谢上述问题的答案