我有一个管理患者人口统计信息的应用程序。连同这些数据,用户可以扫描患者的图片并将该图片分配给患者。当用户单击扫描按钮时,将打开一个单独的应用程序作为对话框以扫描图像。在 XP 上运行它时一切正常。成像应用程序加载良好并获得焦点。然而,在 Vista 上,有时成像应用程序不会获得焦点,并且会在主应用程序后面弹出。当运行全屏或通过 2008 Application Server 时,您看不到应用程序,您只会看到锁定屏幕,并且似乎什么也没发生。有什么办法可以改变 Vista 上的窗口焦点管理以像 XP 那样工作?如果可能的话,我正在寻找一种方法来解决这个问题而不改变实际的应用程序。
4 回答
您可以尝试以下步骤:
1. 右键单击 exe
2. 选择属性
3. 选择兼容性选项卡
4. 检查以兼容模式运行此程序:
5. 选择 Windows XP (Service Pack 2)
我认为您将不得不对您的应用程序进行更改,以使成像应用程序成为焦点。我将假设您的应用程序通过ShellExecute
或启动成像应用程序CreateProcess
。如果是这样,您可以通过SHELLEXECUTEINFO.hProcess
(for ShellExecute
) 或PROCESS_INFORMATION.hProcess
(for CreateProcess
) 获取已启动进程的进程句柄。启动成像应用程序后立即调用AllowSetForegroundWindow API:
AllowSetForegroundWindow(GetProcessId(hProcess));
这将允许成像应用程序在启动时将其主窗口/对话框置于前台。
您可以遍历所有顶级 HWND 并通过其窗口类识别扫描应用程序,然后发送适当的消息以引发窗口。
我不相信这是与 Vista 与 XP 相关的。我认为只是这个成像应用程序需要更长的时间才能在 Vista 上启动。自 Windows 2000 以来,窗口管理器已阻止后台应用程序窃取前台。当应用程序启动时,它有机会创建并显示一个将占据前景的窗口。如果花费的时间太长,窗口管理器会认为当前窗口应该保持前台,并在最终启动时禁止其他应用程序占据前台。
我想不出任何具体的方法来避免这种情况......除了在启动应用程序后使用 FindWindow 搜索其他应用程序窗口。当您最终找到它时,在其上调用 SetForegroundWindow 以将其置于前台。