0

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

4

4 回答 4

1

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

于 2008-10-08T20:03:35.463 回答
1

我认为您将不得不对您的应用程序进行更改,以使成像应用程序成为焦点。我将假设您的应用程序通过ShellExecute或启动成像应用程序CreateProcess。如果是这样,您可以通过SHELLEXECUTEINFO.hProcess(for ShellExecute) 或PROCESS_INFORMATION.hProcess(for CreateProcess) 获取已启动进程的进程句柄。启动成像应用程序后立即调用AllowSetForegroundWindow API:

AllowSetForegroundWindow(GetProcessId(hProcess));

这将允许成像应用程序在启动时将其主窗口/对话框置于前台。

于 2008-10-08T19:19:08.423 回答
0

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

于 2008-10-08T19:07:04.267 回答
0

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

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

于 2008-10-14T13:48:15.253 回答