在制作另一个应用程序后失去了注意力';s最上面的窗口
本文关键字:窗口 注意力 另一个 应用程序 失去 | 更新日期: 2023-09-27 17:48:52
我正在将另一个应用程序的窗口设置在最上面,以确保在我的应用程序中单击一次可以将另一应用程序的对话框带入视图。我遇到的问题是,在通话后,我无法将注意力集中到我的应用程序上。如果另一个应用程序有多个窗口,其中一个窗口最终聚焦,否则没有窗口(只看任务栏)聚焦。我应该从哪里开始调查这个问题?
我的代码使另一个应用程序的顶部是:
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);
相关:Process.MainWindowHandle 的意外行为
基本上,MainWindowHandle会为您提供流程的当前最顶部窗口,而不管文档中有什么内容。
这就解释了为什么你的另一个过程的主窗口不一定得到关注。
你的另一个问题是,在赠送应用程序后,你没有将注意力集中到应用程序上。
事实上,你所做的事情的正确术语是建立z顺序。
与其试图控制z顺序(这是无法保证的),不如向另一个进程发送消息。
您尝试过SWP_NOACTIVATE吗?
[实际使用的解决方案]
到目前为止,我将把调用窗口的窗口句柄发送到目标应用程序,并让它在完成后将其推回到顶部。这真的很痛苦,因为我要处理大约50个窗口,但它看起来很稳定。如果发现有问题,下一种方法是回叫主叫应用程序,并要求它将窗口推到前台,但我宁愿不这样做,因为它引入了一种可能性,即用户可以在消息传输时对主叫应用进行某些操作(只有在同一传输协议上混合了大量消息时才有问题,这很可能发生)
不要试图使用传入窗口句柄,并将目标应用程序中显示的任何窗口的父窗口设置为该句柄,这只会使显示的对话框出现在调用应用程序窗口的范围内,并在必要时进行裁剪-无用的
非常感谢您对