0

我正在将另一个应用程序的窗口置于最顶层,以确保在我的应用程序中单击会将另一个应用程序的对话框带入视图。我遇到的问题是通话后我没有将注意力重新集中到我的应用程序上。如果另一个应用程序有更多窗口,则其中一个最终获得焦点,否则没有窗口(仅查看任务栏)获得焦点。我应该从哪里开始调查这个问题?

我将另一个应用程序置于最高位置的代码是:

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);
4

3 回答 3

2

相关:Process.MainWindowHandle 的意外行为

基本上 MainWindowHandle 为您提供了该过程的当前最顶层窗口,尽管文档说了什么。

这就解释了为什么您的其他进程的主窗口不一定获得焦点。

您的另一个问题是因为您在放弃后没有将焦点返回到您的应用程序。

实际上,您所做的正确术语是建立z-order

与其尝试控制 z 顺序(这无法保证),不如将消息发送到其他进程。

于 2008-10-23T16:11:39.887 回答
2

你试过 SWP_NOACTIVATE 吗?

于 2008-10-23T17:25:36.853 回答
0

[实际使用的解决方案]

到目前为止,我正在将调用窗口的窗口句柄发送到目标应用程序,并在完成后将其推回顶部。这是一个真正的痛苦,因为我要处理大约 50 个窗口,但它看起来很稳定。下一个方法,如果这有问题,将回调调用应用程序并要求它将窗口推到前台,但我宁愿不这样做,因为它引入了用户可以做某事的可能性消息传输时调用的应用程序(如果有大量消息以相同的传输协议进入,这很可能会发生)

不要尝试使用传入的窗口句柄并将目标应用程序中显示的任何窗口的父级设置为该句柄,它只会使显示的对话框出现在调用应用程序窗口的边界内,并在必要时裁剪 - 没用

非常感谢上述问题的答案

于 2008-10-27T21:58:33.737 回答