2008-10-08 131 views
0

我有一个管理病人人口统计信息的应用程序。随着这些数据,用户可以扫描患者的图片并将该图片分配给患者。当用户单击扫描按钮时,会打开一个单独的应用程序作为对话框来扫描图像。在XP上运行时,一切正常。成像应用程序加载良好并获得了关注。然而,在Vista上,成像应用程序偶尔不会获得关注,并会在主应用程序后面弹出。当运行全屏或通过2008 Application Server时,您看不到该应用程序,您只会看到一个锁定的屏幕,看起来什么都没有发生。有什么办法可以改变Vista上的窗口焦点管理以按照XP的方式工作吗?我正在寻找一种方法来解决这个问题,如果可能的话,在不改变实际应用的情况下。Vista窗口焦点问题

回答

0

您可以迭代所有顶级HWND并通过其窗口类识别扫描应用程序,然后发送适当的消息以提升窗口。

1

我认为您必须对您的应用程序进行更改才能让映像应用程序关注焦点。我将假设您的应用程序通过ShellExecuteCreateProcess启动映像应用程序。如果是这样,您可以通过SHELLEXECUTEINFO.hProcess(对于ShellExecute)或PROCESS_INFORMATION.hProcess(对于CreateProcess)获得已启动进程的进程句柄。发射后立即成像应用程序调用API AllowSetForegroundWindow

AllowSetForegroundWindow(GetProcessId(hProcess)); 

这将使成像应用来放置它的主窗口/对话框中的前景时,它的启动。

1

你可以尝试以下步骤:
1.右键单击EXE
2.选择属性
3.选择兼容性选项卡
4.检查运行该程序在campatibility模式:
5.选择Windows XP(Service Pack 2)

+0

我无法这样做,因为此应用程序必须能够从网络驱动器运行,并且您无法在存储在网络驱动器上的应用程序启用兼容模式。 – 2008-10-08 20:59:29

0

我不相信这是Vista与XP相关的。我认为,简单来说这个图像应用程序需要更长的时间才能在Vista上启动 自Windows 2000以来,窗口管理器已阻止后台应用程序窃取前台。当一个应用程序启动时,它有一个机会创建和显示一个窗口,将采取前景。如果需要太长时间,窗口管理者认为当前窗口应该保持前景,并禁止其他应用程序在最终启动时处于前景。

我想不出任何具体的方法来避免这种情况...除了在启动应用程序之后使用FindWindow搜索其他应用程序窗口。当你最终找到它时,调用SetForegroundWindow将它带到前台。

+0

由于主窗口线程在成像应用程序打开时被锁定,因此它不应阻止对焦点的窃取。在XP中这是真的,所以它在XP上根本不会发生。 Vista的DWM通常比XP更好,因为它将Windows视为容器,这只会导致这种情况下的问题。 – 2008-10-15 13:53:00