Windows Vista窗口焦点问题

Windows Vista窗口焦点问题,windows,winforms,windows-vista,usability,Windows,Winforms,Windows Vista,Usability,我有一个管理患者人口统计信息的应用程序。与此数据一起,用户可以扫描患者的图片并将该图片分配给患者。当用户单击扫描按钮时,会打开一个单独的应用程序作为对话框来扫描图像。在XP上运行时,一切正常。成像应用程序加载良好并获得了焦点。然而,在Vista上,偶尔成像应用程序不会获得焦点,会在主应用程序后面弹出。当运行全屏或通过2008应用程序服务器时,您无法看到该应用程序,您只会看到一个锁定的屏幕,看起来什么都没有发生。有没有办法改变Vista上的窗口焦点管理,使其像XP那样工作?如果可能的话,我正在寻找

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

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

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


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

您可以尝试以下步骤:
1.右键单击exe
2.选择属性
3.选择兼容性选项卡
4.检查是否在露营模式下运行此程序:

5.选择Windows XP(Service Pack 2)

我认为这与Vista和XP无关。我认为在Vista上启动这个图像应用程序需要更长的时间。 自Windows 2000以来,窗口管理器已防止后台应用程序窃取前台。当一个应用程序启动时,它有一个机会窗口来创建和显示一个将占据前台的窗口。如果需要的时间太长,窗口管理器会认为当前窗口应该保留前景,并在它最终启动时禁止其他应用使用前景


我想不出任何具体的方法来避免这个。。。而不是在启动应用程序后使用FindWindow搜索“其他应用程序”窗口。当你最终找到它时,对其调用SetForegroundWindow将其置于前台。

我无法执行此操作,因为此应用程序必须能够从网络驱动器运行,并且您无法对存储在网络驱动器上的应用程序启用兼容模式。因为在打开图像应用程序时,主窗口线程被锁定,因此不应防止窃取集中这在XP中是正确的,所以它在XP上根本不会发生。Vista的DWM通常比XP好,因为它将windows视为容器,在这种情况下它只会导致问题。我不知道在这种情况下“锁定”是什么意思。窗口管理器不关心拥有前台的线程是否正在发送消息。不偷前台不依赖当前前台窗口拥有的线程泵送消息来禁止前台盗窃。对不起,我的意思是使用“阻止”这个词。在对话框关闭之前,窗口不接受任何输入。在启动成像应用程序之前,是否已禁用应用程序窗口?禁用的窗口不能激活前景,因此禁用该窗口将导致窗口管理器尝试查找另一个窗口以将前景提供给-将选择一个随机启用的顶级窗口。创建一个没有控件的对话框,其中仅显示文本“Launching Imaging…”。在启动imaging时以模式创建此对话框-它将禁用主框架窗口,但在当前线程上保持前台激活,以便启动的应用程序应保留拍摄前台的功能。
AllowSetForegroundWindow(GetProcessId(hProcess));