托管.NET运行时和窗口焦点,问题和不一致

时间:2008-10-17 10:13:41

标签: .net winapi focus

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

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

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

另外,有时候,如果我们打开这样的.NET表单,然后使用alt-tab转换为Word或其他应用程序,然后单击我们应用程序的任务栏图标,则会出现Win32窗口。这当然还在等待模式.NET窗口关闭,所以它当然无法使用。如果我们alt-tab到其他东西并且只是最小化那个东西,那么我们的.NET窗口会重新出现。

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

我不怀疑我们做错了什么,但我无法弄清楚问题是什么。

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


编辑:好吧,@sam,你说得对,我们在这条道路上有一些不同的设置。两台机器都运行Windows XP SP3,但我的运行是经典的Windows主题,另一台运行新的XP主题。将其他计算机上的主题更改为经典删除了问题,但将其更改回XP主题并未使其重新出现。

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

3 个答案:

答案 0 :(得分:2)

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

您的问题可能会有很大差异,但也许您有不同的操作系统版本?

答案 1 :(得分:1)

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

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

来自Windows窗体(包括窗体)的任何control实现了一个名为IWin32Window的接口,它公开了该窗口的Win32句柄。

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

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

我之前没有太多的喧嚣,使用C ++ \ CLI做过这个,但现在我不介意。也许这对你来说是一个很好的起点。

答案 2 :(得分: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