3

我们有一个 Win32 应用程序,它承载 .NET 运行时并从应用程序的 Win32 部分打开 .NET 托管表单。

这些窗口始终作为模态窗口打开。

在某些机器上,当这些窗口关闭时,位于后面的 Win32 窗口不会获得焦点,而是在 Word、Outlook 或您可能打开的任何其他窗口后面发送。

此外,有时,如果我们打开这样的 .NET 表单,然后用 alt-tab 键转到 Word 或其他应用程序,然后单击我们应用程序的任务栏图标,就会出现 Win32 窗口。这当然还在等待模态 .NET 窗口关闭,所以它当然是不可用的。如果我们 alt-tab 到其他东西并最小化其他东西,那么我们的 .NET 窗口就会重新出现。

不一致的部分是这只发生在某些机器上,而不是全部。在包括我的在内的许多机器上,它完全按预期工作。每次都聚焦到正确的窗口。

我不怀疑我们做错了什么,但我不知道问题出在哪里。

有谁知道我应该寻找什么?我们已经查看了安装的 .NET 运行时,并且由于两台这样的机器在其中一台上运行但在另一台上不运行都是开发人员机器,它们包含相同的 .NET 服务包等。


编辑:嗯,@sam,你说得对,我们在这条车道上有一些不同的设置。两台机器都运行 Windows XP SP3,但我的运行的是经典的 windows 主题,而另一台运行的是新的 XP 主题。将另一台计算机上的主题更改为经典主题可以解决问题,但将其更改回 XP 主题并没有使其重新出现。

所以现在我们有两台机器可以工作,客户仍然有问题,即使客户显然运行经典主题。

4

3 回答 3

2

最近我注意到windows vista Aero上的窗口焦点设置与以前在XP上的设置不同。主窗口将在重新激活时获得焦点,而不是应用程序的最后一个激活窗口。
有趣的是,将 vista 更改为旧风格的 windows 主题(经典或基本),焦点将设置到最后拥有它的子窗口,就像在 XP 上一样。

您的问题可能非常不同,但也许您有不同的操作系统版本?

于 2008-10-17T10:36:22.923 回答
1

这个问题提醒我 WPF 在从父窗口显示对话框时也有同样的问题。

我假设您指的是 .NET 框架的 2.0 版,并且您有一个调用 .NET 程序集的本机模块。

Windows 窗体(也包括窗体)中的任何控件都实现了一个名为IWin32Window的接口,该接口公开了该窗口的 Win32 句柄。

您可以做的是使用NativeWindow来侦听 WM_ACTIVATEAPP 或任何表明您的应用程序具有焦点的事件,并向 .NET 窗口发送信号以获取焦点。

其他选项是使用承载 .net 用户控件而不是 winforms 的本机对话框(如果可以的话)。

我以前用 C++\CLI 做过这件事,没有太多麻烦,但现在我没有想到。也许这对您来说是一个很好的起点。

于 2008-10-17T11:28:07.343 回答
0

我记得帮助有同样问题的朋友(不记得是在 .net 2.0 还是 3.5 中)

我假设您在主表单上创建新表单并使用

Form2 form2 = new Form2();
form2.ShowDialog();

要显示模式弹出窗口,现在显然 ShowDialog 方法似乎默认情况下不使用调用 ShowDialog 作为其处理程序的表单,因此您需要这样做

form2.ShowDialog(this);

这样,据我所知,应用程序知道要返回哪个句柄,因此总是返回到您的 main 。

有关 ShowDialog 表单 msdn 的其他信息:http: //msdn.microsoft.com/en-us/library/w61zzfwe.aspx

于 2008-10-17T11:42:34.163 回答