Winapi Windows 7对全屏应用程序有不同的处理方式吗?

Winapi Windows 7对全屏应用程序有不同的处理方式吗?,winapi,windows-7,fullscreen,execution,Winapi,Windows 7,Fullscreen,Execution,我有一个隐藏进程,它等待非标准硬件按钮消息并运行应用程序(使用CreateProcess)。用户干扰没有问题,这是用户自己批准的操作。一切都很好,当它的任务栏显示和倍增字幕和非字幕窗口的正常布局。但是在XP和7中,当当前应用程序是全屏的时候,情况就不同了。在这种情况下,全屏应用程序是没有边框的窗口,其尺寸与屏幕尺寸完全相同。Windows会隐藏此类应用程序的任务栏,即使它始终处于打开状态 在Xp中,没关系,在本例中显示的是任务栏和应用程序(例如计算器),此外,除了已启动的应用程序和任务栏之外,全

我有一个隐藏进程,它等待非标准硬件按钮消息并运行应用程序(使用CreateProcess)。用户干扰没有问题,这是用户自己批准的操作。一切都很好,当它的任务栏显示和倍增字幕和非字幕窗口的正常布局。但是在XP和7中,当当前应用程序是全屏的时候,情况就不同了。在这种情况下,全屏应用程序是没有边框的窗口,其尺寸与屏幕尺寸完全相同。Windows会隐藏此类应用程序的任务栏,即使它始终处于打开状态

在Xp中,没关系,在本例中显示的是任务栏和应用程序(例如计算器),此外,除了已启动的应用程序和任务栏之外,全屏应用程序仍然可见。但在Windows7中,没有任何视觉效果发生,全屏应用程序仍然打开,如果我切换到任务栏,执行的应用程序就在那里。我尝试使用SetForegroundWindow、BringwindowToop甚至AllowSetForegroundWindow(GetCurrentProcessId())调用CreateProcess WaitForIntputIdle EnumThreadWindows找到的窗口句柄来解决这个问题,没有更改。那么,自从XP与官方记录的全屏窗口相关以来,有什么变化吗

谢谢

Max

Windows支持多个桌面,我猜全屏up使用的桌面与默认桌面不同(将显示您的应用程序)。Windows中的桌面对象是“逻辑显示表面,包含用户界面对象,如窗口、菜单和挂钩”。例如,屏幕保护程序通常在单独的桌面上启动

您可以使用Process Explorer找出应用程序正在哪个桌面上运行:

  • 将Process Explorer设置为替换任务管理器并始终在顶部运行
  • 显示全屏时,按Ctrl+Shift+Esc启动Process Explorer
  • 在Process Explorer中,选择全屏流程并按Ctrl+H以显示此流程的句柄
  • 查看列表中桌面项目的值。通常这将设置为默认值
如果您知道此应用程序在哪个桌面上运行,您可以在同一桌面上启动您的进程,方法是首先调用此桌面的句柄,然后将其传递到您的呼叫中。

Vista引入了此功能。简言之,所有窗口都绘制到内存位图,然后桌面窗口管理器将合成这些位图并在全屏Direct3D表面上绘制。全屏窗口不参与桌面合成,直接在屏幕上绘图(主要是因为大多数全屏应用程序都是需要实时屏幕更新的游戏)

特别是,这意味着当全屏应用程序启动并运行时,它将覆盖DWM合成的图像,用户需要切换到DWM管理的窗口,以便DWM开始在全屏应用程序顶部绘图

不幸的是,我没有一个很好的办法来解决你的问题。解决这个问题的一种方法是将WS_字幕样式添加到你的应用程序中,然后自己处理
WM_NCPAINT
/
WM_NCCALCSIZE
/
WM_NCHITTEST
。这将允许您向DWM谎称您是一个常规的窗口应用程序,但在视觉上更改NC区域,使其看起来像没有标题一样。然而,这确实需要一定数量的额外代码,并且可能需要投入更多的精力

另一种解决问题的方法是在启动新流程时显式地最小化全屏应用程序窗口。然而,您将不得不解决何时再次将其最大化的问题


顺便说一句,你可能会发现陈雷蒙(Raymond Chen)的评论很有趣。

我想,如果你有自己的硬件设备,就会有一些用于生成“真实”用户输入的API。很明显,传统的键盘和鼠标,以及现在的USB HID驱动程序(我想很多都是usermode?)都可以访问API来实现这一点

例如,Synergy+可以在连接的PC上生成假键盘和鼠标事件,假输入的结果是windows正常切换激活

所以,我最初的想法是让你的usermode“设备”应用程序合成实际的键盘消息——SendInput似乎是一个可能的候选API,它可以“伪造”真实的用户输入事件

然后,在“UI”应用程序中使用类似RegisterHotKey的API来响应设备应用程序生成的热键组合


现在,(假设SendInput正在以正确的级别生成用户输入事件),您应该(在UI应用程序中的WM_热键处理程序中)有权(因为一切都是“用户启动的”)更改前景窗口(为您自己).

默认情况下,全屏应用程序与任何其他应用程序使用相同的桌面。@Franci Penov:是的,但谁说有问题的应用程序使用相同的桌面?当然,这只是一个猜测,但值得一提的是,在这种情况下,从
CreateProcess
开始的过程将不可见,并且您将看到与OP描述的完全相同的症状。您是是的,这是一种可能性。然而,在一个单独的桌面上运行是非常罕见的情况,所以我想OP会明确提到它。@France Penov:屏幕保护程序、信息亭应用程序等通常在他们自己的桌面上运行。大多数开发人员都不知道有可能有多个桌面操作。根据我的理解,桌面组合将/不应该对调用
setforegroundindow
bringwindowtop
等产生影响。我相信
setforegroundindow
可以防止中断全屏应用程序,以防止后台进程在游戏中弹出。
bringwindowtop
操纵Z顺序,全屏应用程序不参与正常的Z顺序(或在ac