C# 制作另一个应用程序后焦点丢失';最上面的窗户

C# 制作另一个应用程序后焦点丢失';最上面的窗户,c#,winapi,focus,z-order,topmost,C#,Winapi,Focus,Z Order,Topmost,我正在使另一个应用程序的窗口位于最上方,以确保在我的应用程序中单击一次可将另一个应用程序的对话框带入视图。我遇到的问题是,通话结束后,我的应用程序无法恢复焦点。如果另一个应用程序有多个窗口,其中一个窗口将以焦点结束,否则没有窗口(仅查看任务栏)获得焦点。我应该从哪里开始调查这个问题 我将另一个应用程序设置为最顶级的代码是: Process p = Process.GetProcessById(trackedProcessID); IntPtr h = p.MainWindowHandle; ui

我正在使另一个应用程序的窗口位于最上方,以确保在我的应用程序中单击一次可将另一个应用程序的对话框带入视图。我遇到的问题是,通话结束后,我的应用程序无法恢复焦点。如果另一个应用程序有多个窗口,其中一个窗口将以焦点结束,否则没有窗口(仅查看任务栏)获得焦点。我应该从哪里开始调查这个问题

我将另一个应用程序设置为最顶级的代码是:

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);
相关的:

基本上,MainWindowHandle为您提供了流程中最顶层的窗口,不管文档中怎么说

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

你的另一个问题是,在你的应用程序发布后,你没有将焦点返回到它

实际上,你所做的正确术语是建立

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

相关:

基本上,MainWindowHandle为您提供了流程中最顶层的窗口,不管文档中怎么说

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

你的另一个问题是,在你的应用程序发布后,你没有将焦点返回到它

实际上,你所做的正确术语是建立


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

您尝试过SWP\U NOACTIVE吗?

您尝试过SWP\U NOACTIVE吗?

[实际使用的解决方案]

到目前为止,我将把调用窗口的窗口句柄发送到目标应用程序,并让它在完成后将其推回到顶部。这是一个真正的痛苦,因为我将有约50个窗口来处理,但它似乎稳定。如果出现问题,下一种方法是回拨呼叫应用程序,让它将窗口推到前台,但我不希望这样,因为这会引入一种可能性,即用户可以在消息传输过程中对呼叫应用程序执行某些操作(只有在同一传输协议中有大量消息时才会出现问题,这种情况很可能发生)

不要尝试使用传入窗口句柄并将目标应用程序中显示的任何窗口的父窗口设置为该句柄,这只会使显示的对话框显示在调用应用程序窗口的范围内,并在必要时进行裁剪-无用

非常感谢您对上述问题的回答

[实际使用的解决方案]

到目前为止,我将把调用窗口的窗口句柄发送到目标应用程序,并让它在完成后将其推回到顶部。这是一个真正的痛苦,因为我将有约50个窗口要处理,但它似乎是稳定的。下一个方法,如果这被证明有问题,将回拨调用应用程序并要求它推窗口在前台,但我不希望这样做,因为它引入了一种可能性,即用户可以在消息传输过程中对呼叫应用程序执行某些操作(只有在同一传输协议中有大量消息时才会出现问题,这种情况很可能会发生)

不要尝试使用传入窗口句柄并将目标应用程序中显示的任何窗口的父窗口设置为该句柄,这只会使显示的对话框显示在调用应用程序窗口的范围内,并在必要时进行裁剪-无用


非常感谢您对上述问题的回答

非常有趣!但即使我的第二个应用只有一个可见窗口(同样,来自任务栏,这可能不是一个好的来源),我也会期望,一旦另一个应用中的对话框关闭,我的对话框将恢复焦点。或者?不,不一定,您需要返回焦点(实际上这里的术语是正确的z顺序)到你的应用程序。我可以通过将另一个应用程序按z顺序排在我的前面来做到这一点吗,或者我必须让另一个应用程序推我上去(请告诉我我可以…)非常有趣!但是即使我的第二个应用程序只有一个可见窗口(同样,从任务栏,这可能不是一个好的来源)我本以为一旦另一个应用程序中的对话框关闭,我的应用程序就会恢复焦点。或者?不,不一定,你需要将焦点(实际上这里的术语是正确的z顺序)返回到你的应用程序。我可以通过将另一个应用程序按z顺序排在我的前面来实现这一点,还是我必须让另一个应用程序推我上去(请告诉我我能…)似乎没有任何效果,你希望它做什么?我希望它不会激活其他顶级窗口。如果没有激活,它将不会获得焦点。如果没有任何效果,你希望它做什么?我希望它不会激活其他顶级窗口。如果没有激活,它将不会获得焦点。